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
Lepaskan: 2024-12-06 10:42:13
asal
566 orang telah melayarinya

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};
}
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan