Vektor dan Rentetan Constexpr dalam C 20: Menyelesaikan Ralat Pengkompil
Apabila cuba mencipta objek constexpr std::string dan std::vector , anda mungkin menghadapi ralat pengkompil yang menunjukkan bahawa ungkapan tidak mempunyai nilai tetap. Walaupun menggunakan versi Microsoft Visual Studio 2019 terkini, yang menyokong rentetan dan vektor constexpr, ralat ini boleh berterusan.
Peruntukan Sementara lwn. Peruntukan Bukan Sementara
Isunya timbul daripada fakta bahawa sokongan peruntukan constexpr dalam C 20 adalah terhad kepada peruntukan sementara. Peruntukan sementara diagihkan pada penghujung penilaian berterusan, menghalang kegigihan peruntukan.
Dalam kes anda, penggunaan std::vector dan std::string melibatkan peruntukan memori dinamik, yang bukan sementara . Oleh itu, pengkompil menandakan ini sebagai pelanggaran sekatan peruntukan sementara.
constexpr std::vector cv{ 1, 2, 3 };
Penyelesaian untuk Peruntukan Sementara dalam Constexpr
Untuk menyelesaikan isu ini dan gunakan vektor atau rentetan dalam constexpr, pastikan bahawa peruntukan adalah sementara. Ini bermakna peruntukan memori mesti diagihkan sepenuhnya sebelum penilaian berterusan tamat.
Sebagai contoh, anda boleh menggunakan fungsi untuk melaksanakan peruntukan dalam constexpr, seperti dalam contoh berikut:
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dalam kes ini, peruntukan vektor adalah sementara kerana memori diagihkan apabila fungsi kembali. Ini membolehkan penggunaan std::vector semasa masa constexpr.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat Pengkompil Apabila Menggunakan `constexpr std::vector` dan `constexpr std::string` dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!