Pertanyaan Akses ke variabel constexpr di dalam ekspresi lambda tanpa menangkap


Pada contoh berikut, saya dapat mengakses constexpr variabel x dari dalam lambda y tanpa secara eksplisit menangkapnya. Ini tidak mungkin jika x tidak dideklarasikan sebagai constexpr.

Apakah ada aturan khusus yang berlaku constexpr untuk menangkap?

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
2018-05-09 06:53


asal


Jawaban:


Apakah ada aturan khusus yang berlaku constexpr untuk menangkap / mengakses?

Iya nih, constexpr variabel dapat dibaca tanpa menangkap lambda:

Ekspresi lambda dapat membaca nilai variabel tanpa menangkap   jika variabelnya

  • memiliki const integral atau tipe enumerasi non-volatile dan telah diinisialisasi dengan ekspresi konstan, atau
  • adalah constexpr dan trivially copy constructible.

32
2018-05-09 07:03