Rumah >pembangunan bahagian belakang >C++ >Mengapa C 20 Saya Tidak `constexpr` `std::vector` dan `std::string` Berfungsi?
C 20 constexpr Vector and String Not Working
Dalam isu ini, seorang pengaturcara cuba mencipta objek constexpr std::string dan std ::vector, tetapi menghadapi ralat pengkompil yang menyatakan bahawa ungkapan mesti mempunyai nilai tetap. Isu ini timbul walaupun menggunakan versi Microsoft Visual Studio 2019 terkini, yang menyokong rentetan dan vektor constexpr.
Penjelasan Masalah
Ralat berpunca daripada sokongan peruntukan constexpr terhad dalam C 20, yang hanya membenarkan peruntukan sementara. Peruntukan sementara memerlukan memori yang diperuntukkan diuruskan sepenuhnya menjelang akhir penilaian berterusan.
Contoh Kod Tidak Sah
Contoh berikut menggambarkan ralat:
int main() { constexpr std::vector<int> v = {1, 2, 3}; }
Di sini, peruntukan untuk v berterusan, menjadikannya tidak sementara. Pengkompil dengan betul menghasilkan ralat yang menunjukkan bahawa ungkapan tidak dinilai kepada pemalar kerana v memegang peruntukan timbunan semasa penilaian berterusan.
Contoh Kod Sah
Walau bagaimanapun , menggunakan std::vector semasa masa constexpr adalah mungkin dengan sementara peruntukan.
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dalam contoh ini, peruntukan v adalah sementara kerana memori diagihkan apabila f() kembali. Ini membolehkan penggunaan std::vector semasa masa constexpr.
Atas ialah kandungan terperinci Mengapa C 20 Saya Tidak `constexpr` `std::vector` dan `std::string` Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!