Rumah >pembangunan bahagian belakang >C++ >Mengapa C 20 Saya Tidak `constexpr` `std::vector` dan `std::string` Berfungsi?

Mengapa C 20 Saya Tidak `constexpr` `std::vector` dan `std::string` Berfungsi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-06 10:42:13540semak imbas

Why Aren't My C  20 `constexpr` `std::vector` and `std::string` Working?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn