有谁知道,如果“TS”的下面隐含捕捉以及形成:
template<class ... Ts> void bar(Ts ... ts) { }
template<class ... Ts> int foo(Ts ... ts) {
auto L = [=] () {
bar(ts...);
};
L();
return 0;
}
int g = foo(1, 2, 3);
是否标准明确任何地方指出,这不应该被很好地形成?
有谁知道,如果“TS”的下面隐含捕捉以及形成:
template<class ... Ts> void bar(Ts ... ts) { }
template<class ... Ts> int foo(Ts ... ts) {
auto L = [=] () {
bar(ts...);
};
L();
return 0;
}
int g = foo(1, 2, 3);
是否标准明确任何地方指出,这不应该被很好地形成?
14.5.3 / 6:
一包扩展为不是的实例化
sizeof...
表达产生一个列表E1,E2,...,EN,其中N是在包膨胀参数元素的数量。 每个Ei的通过实例化图案和其第i个元素替换每个包扩展参数生成。 所有的EI成为封闭的列表元素。
不管你被允许明确捕获包(你可以使用[ts ...]
扩张的一般规律将导致列表中的每个元素的捕捉。
我想这是良好的,我还没有找到一个直接声明(措辞有时缺乏清晰度/插图某些情况下),但我想这可以推断:
§5.1.2/ 23:
A捕获后接省略号是一包扩展(14.5.3)。 [实施例:
template<class... Args>
void f(Args... args) {
auto lm = [&, args...] { return g(args...); };
lm();
}
- 端示例]
args
,在λ-捕获 ,是一个捕获(在这种情况下,显式)的例子,以及注目的事实是, args
是一个参数包标识符 。 这种短款具有描述的λ-捕获如何抱包扩展,这表明参数包可以,即使其目的不是让他们被捕获被捕获的唯一的工作。 §5.1.2/ 12:
如果是显式或隐式捕获的实体被捕获 。[...]
§3/ 3:
一个实体是一个值,对象,参考,功能,枚举,类型,类的成员,模板,模板特,命名空间参数包 ,或此。
从这我假设参数包是可以明确或含蓄地被捕获 ,因此,同样的拍摄规则对于普通的变量应适用,但参数包应相应扩大实体 。
我想你的问题(和相同的论证)可以为例如参考变量适用同样( 这是不确定的引用是否需要存储。§8.3.2/ 4 )。 看来,当你允许或不提及的参数组标识符拉姆达里面你有兴趣。
你可以想想参考变量相同外范围,因为你可以访问他们,但甚至不能被允许访问原始变量的标识符。
他们是作为参数包的空灵。