variabel constexpr tidak ditangkap
Kode berikut tidak dapat dikompilasi di clang (seperti di GCC):
struct A{
int a;
};
auto test(){
constexpr A x{10};
return []{
return x; // <-- here x is A: clang doesn't compile
}();
}
Kesalahan Clang adalah variabel 'x' tidak dapat ditangkap secara implisit dalam lambda tanpa capture-default yang ditentukan , tapi saya pikir variabel constexpr selalu ditangkap.
Jika x adalah int, kode mengkompilasi:
auto test(){
constexpr int x{10};
return []{
return x; // <-- here x is int: clang is ok
}();
}
Menariknya, kode berikut juga dikompilasi:
auto test(){
constexpr A x{10};
return []{
return x.a;
}();
}
Apakah dentang benar? Jika ya, apa alasannya? Saya menggunakan -std = c ++ 17
--EDIT--
Pertanyaan berikut: Dapatkah saya menggunakan nilai constexpr di lambda tanpa menangkapnya? tidak terkait dengan yang satu ini, karena dengan clang11 itu tidak lagi menjadi masalah: sebenarnya, seperti yang dinyatakan di atas, jika x adalah kompilasi int, clang11.
Kode sampel juga ada di https://godbolt.org/z/rxcYjz
Jawaban
Ketika Anda return x;
dalam contoh pertama, Anda harus memanggil A
konstruktor salinan, yang melibatkan pengikatan referensi ke x
dan karenanya odr-menggunakannya. Argumen dapat dibuat bahwa salinan sepele dari nilai yang dapat digunakan dalam ekspresi konstan tidak boleh menggunakan odr-use lebih dari return x.a;
, tetapi tidak ada pengecualian seperti itu dalam aturan itu, jadi Clang benar untuk menolaknya.
Secara praktis, tentu saja Anda dapat membuat constexpr
variabel apa pun static
untuk menghindari kebutuhan untuk menangkapnya.