Доступ к переменной constexpr внутри лямбда-выражения без захвата - PullRequest
0 голосов
/ 09 мая 2018

В следующем примере я могу получить доступ к переменной constexpr x изнутри лямбды y без явного ее захвата. Это невозможно, если x не объявлено как constexpr.

Существуют ли специальные правила, которые применяются к constexpr для захвата?

int foo(auto l) {
    // OK
    constexpr auto x = l();
    auto y = []{return x;};
    return y();

    // NOK
    // auto x2 = l();
    // auto y2 = []{ return x2; };
    // return y2();        
}

auto l2 = []{return 3;};

int main() {
    foo(l2);
}

1 Ответ

0 голосов
/ 09 мая 2018

Существуют ли специальные правила, которые применяются к constexpr для захвата / доступа?

Да, constexpr переменные могут быть прочитаны без ввода в лямбда :

Лямбда-выражение может считывать значение переменной без захвата это если переменная

  • имеет постоянный энергонезависимый интеграл или тип перечисления и был инициализирован постоянным выражением, или
  • является constexpr и тривиально копируемым конструктом.
...