Igo*_* R. 4 c++ lambda language-lawyer c++17
我很高兴看到指向Standard段落的指针,指出以下代码格式正确:
int main() {
int var = 0;
return [] { return sizeof(var); }(); // var is not captured!
}
Run Code Online (Sandbox Code Playgroud)
类似的示例出现在第8.4.5.2节中,但我找不到任何口头描述。
它是根据何时必须捕获实体而不是何时可能捕获来指定的。
[expr.prim.lambda.capture](有一些遗漏)
8 ...如果通用lambda odr的lambda表达式或函数调用操作符模板的实例使用此变量或变量,并且该变量具有从其到达范围起自动存储的持续时间,则该实体应由lambda-expression捕获。...
[?例:
Run Code Online (Sandbox Code Playgroud)void f1(int i) { int const N = 20; auto m1 = [=]{ int const M = 30; auto m2 = [i]{ int x[N][M]; // OK: N and M are not odr-used // ... }; }; // ... }-?示例?]
您的代码示例中的密钥var是未经使用的,因为它是未评估的操作数。因此,不需要捕获它。