g ++不允许在lambda中通过引用对const对象进行广义捕获?

Aar*_*aid 21 c++ lambda c++14

这被g ++(4.9.3和5.2.0)拒绝,但是被clang 3.5.0接受:

int main() { 
    const int ci = 0;
    auto lambda = [ &cap = ci ]() { };
}
Run Code Online (Sandbox Code Playgroud)

g ++给出error: binding ‘const int’ to reference of type ‘int&’ discards qualifiers.似乎g ++拒绝允许捕获非const引用,当然除了使用普通的旧C++ 11捕获[&ci].这似乎是一个非常奇怪的约束,也许是g ++中的一个错误?

Col*_*mbo 12

您的代码有效.§5.1.2/ 11

一个INIT-捕获的行为就好像它声明并明确地捕获形式的可变
" auto INIT-捕获 ; "
,其陈述区域是λ-表达化合物语句 [...]

现在,显然,宣告

auto &cap = ci;
Run Code Online (Sandbox Code Playgroud)

捕获cap很好.那是,

int main() { 
    const int ci = 0;
    auto &cap = ci;
    auto lambda = [&cap]() { };
}
Run Code Online (Sandbox Code Playgroud)

与GCC汇编.除了声明区域和生命周期之外cap,此片段与您的片段没有区别,因此GCC不正确.
此错误已报告为#66735,其中有一个类似的示例:

int x = 0;
auto l = [&rx = static_cast<const int&>(x)] {};
Run Code Online (Sandbox Code Playgroud)