可以在c++ 11 lambda中隐式捕获参数包吗?
Can a parameter pack be captured implicitly within C++11 lambdas?
有谁知道下面对'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, whereN是包扩展参数中元素的个数。每个Ei都是通过实例化模式并将每个包扩展参数替换为其with元素来生成的。所有Ei都成为封闭列表中的元素。
无论您是否被允许显式捕获包(您可以使用[ts ...]
),扩展的一般规则将导致捕获列表的每个元素。
我猜它的格式很好,我没有发现一个直接的陈述(措辞有时缺乏清晰度/说明某些情况),但我猜它可能是推断出来的:
§5.1.2/23:
捕获后跟一个省略号的是一个包展开(14.5.3)。(例子:
template<class... Args>
void f(Args... args) {
auto lm = [&, args...] { return g(args...); };
lm();
}
- end示例]
- 捕获后跟一个省略号,意味着
args
,在lambda捕获中,是捕获的一个例子(在这种情况下,显式的),值得注意的事实是args
是一个参数包标识符。这个简短的段落的唯一工作是描述lambda-capture 保持包扩展,它演示了参数包可以被捕获,即使它的目的不是关于允许被捕获。
§5.1.2/12:
如果被显式或隐式捕获,则实体被捕获。[…]
§3/3:
实体是值、对象、引用、函数、枚举数、类型、类成员、模板、模板特化、命名空间、参数包或this。
由此我假设参数包是可以显式或隐式捕获的实体,因此,与普通变量相同的捕获规则将适用,除了参数包应相应地扩展。
我猜你的问题(和相同的论证)可以同样适用于引用变量,例如(它是未指定的引用是否需要存储。§8.3.2/4)。当允许或不允许在lambda中引用参数包标识符时,您似乎感兴趣。
对于外部作用域中的引用变量也可以这样考虑,因为您可以访问它们,但甚至不允许访问原始变量的标识符。
它们和参数包一样虚无缥缈
相关文章:
- 如何反转整数参数包
- 如何将enable-if与模板参数和参数包一起使用
- 模板元编程:如何将参数包组合成新的参数包
- C ++:在构造函数中使用参数包?
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 双模板参数包
- 参数包构造函数在类模板中隐藏用户定义的转换
- 嵌套参数包扩展失败
- 参数包中的筛选器类型
- 参数和参数包的类型推导
- 为模板参数包添加别名
- enable_if中参数包的大小问题
- 如何使特征接受参数包?
- C++:我可以在模板参数包中强制执行至少1个agment吗
- 有什么优雅的方式吗?(类型参数包)
- 我可以有常量参数包吗
- 我可以展开一个参数包并定义一个参数列表吗?
- c++ Concepts TS会启用多个参数包吗?
- 计算结果为"void..."的非类型参数包不是非法的吗?
- 可以在c++ 11 lambda中隐式捕获参数包吗?