use*_*570 5 c++ lambda language-lawyer
我正在尝试CppCon上展示的一个使用lambdas的示例。令我惊讶的是,该程序不在 gcc 和 clang 中编译(在 C++14 或 C++17 中),而是在 msvc 中编译。这可以在这里得到验证。
作为参考,示例代码如下:
#include <stdio.h>
int g = 10;
auto kitten = [=]() { return g+1; };
auto cat = [g=g]() { return g+1; };
int main() {
g = 20;
printf("%d %d\n", kitten(), cat());
}
Run Code Online (Sandbox Code Playgroud)
这里有什么问题(如果有的话)以及哪个编译器是正确的?
请注意,该代码是从他们的官方演示幻灯片中精确复制粘贴的。
这是 MSVC 的问题。clang 和 g++ 是正确的。
\n来自[expr.prim.lambda.capture]/3(C++17 草案 N4659)
\n\n最小封闭作用域是块作用域 (6.3.3) 的 lambda 表达式是局部 lambda 表达式;任何\n其他 lambda 表达式在其 lambda 引入器中不应有 capture-default 或 simple-capture。本地 lambda 表达式的到达作用域是一组封闭作用域,直至并包括最内层的封闭函数及其参数。[ 注意:此到达范围包括任何介入的 lambda 表达式。\n\xe2\x80\x94end note ]
\n
由于=是 a capture-default,并且 lambda 不在块作用域内,因此代码无效。