作者:橙色kop | 来源:互联网 | 2023-02-01 15:42
以下C++代码使编译器GCC(6.3.0)和Clang(3.8.0)变得疯狂.
for (auto v : vectors2d)
for_each (begin(ret), end(ret), [v[3]] (int &n) { n+= v[3];});
虽然以下情况很好
for (auto v : vectors2d) {
auto val = v[3];
for_each (begin(ret), end(ret), [val] (int &n) { n+= val;});
}
我知道在C++ 14中我可以做类似的事情
for (auto v : vectors2d)
for_each (begin(ret), end(ret), [val=v[3]] (int &n) { n+= val;});
GCC中的错误是
expected identifier before '[' token
克朗说
expected ',' or ']' in lambda capture list
我的问题是:为什么[v[3]]
出现在捕获列表中是违法的?
1> Baum mit Aug..:
我的问题是为什么它[v[3]]
在捕获列表中是非法的?
如N4141中的5.1.2/1 [expr.prim.lambda]中所述,捕获列表中的项应为简单捕获或初始捕获.
前者是任何一种
识别码
&
识别码
this
,
后者是标识符初始化器或&
标识符初始化器.
v[3]
不符合上述任何条件,因此编译器正确拒绝.