Лямбда: незафиксированные объекты в неоцененном контексте - PullRequest
4 голосов
/ 07 октября 2019

Буду признателен за указатель на стандартный абзац, в котором указано, что следующий код правильно сформирован:

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

Подобный пример приведен, например, в § 8.4.5.2, но яне мог найти словесное описание этого.

1 Ответ

6 голосов
/ 07 октября 2019

Указывается с точки зрения того, когда сущность должна быть захвачена, а не с точки зрения того, когда она не может.

[expr.prim.lambda. capture] (с некоторыми пропусками)

8 ... Если лямбда-выражение или экземпляр шаблона оператора вызова функции универсального лямбда-выражения используют это илипеременная с автоматической продолжительностью хранения от ее достигающей области, этот объект должен быть захвачен лямбда-выражением...

[Пример:

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потому что это неоцененный операнд. Как таковой, он не должен быть захвачен.

...