Lambda捕获数组元素失败

CS *_*Pei 3 c++ lambda gcc language-lawyer clang++

以下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];});
Run Code Online (Sandbox Code Playgroud)

虽然以下情况很好

for (auto v : vectors2d) {
    auto val = v[3];
    for_each (begin(ret), end(ret), [val] (int &n) { n+= val;});
}
Run Code Online (Sandbox Code Playgroud)

我知道在C++ 14中我可以做类似的事情

for (auto v : vectors2d)
    for_each (begin(ret), end(ret), [val=v[3]] (int &n) { n+= val;});
Run Code Online (Sandbox Code Playgroud)

GCC中的错误是

expected identifier before '[' token
Run Code Online (Sandbox Code Playgroud)

克朗说

expected ',' or ']' in lambda capture list
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么[v[3]]出现在捕获列表中是违法的?

Bau*_*gen 7

我的问题是为什么它[v[3]]在捕获列表中是非法的?

如N4141中的5.1.2/1 [expr.prim.lambda]中所述,捕获列表中的项应为简单捕获初始捕获.

前者是任何一种

  • 识别码
  • & 识别码
  • this,

后者是标识符初始化器& 标识符初始化器.

v[3] 不符合上述任何条件,因此编译器正确拒绝.