Lambda:未评估上下文中的未捕获对象

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节中,但我找不到任何口头描述。

Sto*_*ica 6

它是根据何时必须捕获实体而不是何时可能捕获来指定的。

[expr.prim.lambda.capture](有一些遗漏)

8 ...如果通用lambda odr的lambda表达式或函数调用操作符模板的实例使用此变量或变量,并且该变量具有从其到达范围起自动存储的持续时间,则该实体应由lambda-expression捕获。...

[?例:

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
      // ...
    };
  };
  // ...
}
Run Code Online (Sandbox Code Playgroud)

-?示例?]

您的代码示例中的密钥var是未经使用的,因为它是未评估的操作数。因此,不需要捕获它。