首页 > 解决方案 > Lambda:未评估上下文中未捕获的对象

问题描述

我很感激一个指向标准段落的指针,指出以下代码格式正确:

int main() {
    int var = 0;
    return [] { return sizeof(var); }(); // var is not captured!
}

类似的例子出现在第 8.4.5.2 节中,但我找不到任何关于它的口头描述。

标签: c++lambdalanguage-lawyerc++17

解决方案


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

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

8 ... 如果 lambda 表达式或泛型 lambda odr 的函数调用运算符模板的实例化使用 this 或从其到达范围内具有自动存储持续时间的变量,则该实体应由 lambda 表达式捕获。...

[ 例子:

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是未使用 odr,因为它是未评估的操作数。因此,它不需要被捕获。


推荐阅读