这被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-捕获的行为就好像它声明并明确地捕获形式的可变
"autoINIT-捕获;",其陈述区域是λ-表达的化合物语句 [...]
现在,显然,宣告
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)