web-dev-qa-db-ja.com

キャプチャせずにラムダ式内のconstexpr変数にアクセスする

次の例では、ラムダconstexprの内部からx変数yに、明示的にキャプチャせずにアクセスできます。 xconstexprとして宣言されていない場合、これは不可能です。

キャプチャするために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);
}
32
wimalopaan

キャプチャ/アクセスのためにconstexprに適用される特別なルールはありますか?

はい、constexpr変数は lambda でキャプチャせずに読み取ることができます:

ラムダ式は、変数の場合、変数をキャプチャせずに変数の値を読み取ることができます

  • const不揮発性積分型または列挙型を持ち、定数式で初期化されている、または
  • constexprであり、簡単にコピーして構築できます。
32
songyuanyao