constexpr C 20 Vektor dan Rentetan: Dilema Peruntukan Sementara
Walaupun standard C 20 memperkenalkan sokongan constexpr untuk vektor dan rentetan, pembangun boleh menghadapi ralat pengkompil yang tidak dijangka apabila cuba mencipta objek constexpr ini jenis.
Dalam contoh di bawah, pengkompil menimbulkan ralat yang menunjukkan bahawa ungkapan memerlukan nilai tetap:
#include <vector> #include <string> int main() { constexpr std::string cs{ "hello" }; constexpr std::vector cv{ 1, 2, 3 }; return 0; }
Walaupun Visual Studio 2019 versi 16.11.4 mendakwa menyokong vektor constexpr dan rentetan, isu ini berpunca daripada pengehadan dalam peruntukan konstexpr C 20 semantik.
Tidak seperti pembolehubah constexpr, bekas C 20 constexpr hanya menyokong peruntukan sementara. Ini bermakna ingatan yang diperuntukkan semasa penilaian berterusan mesti dikeluarkan sepenuhnya sebelum penilaian tamat. Vektor, bagaimanapun, sememangnya memerlukan peruntukan memori dinamik, yang menghalang keupayaan mereka untuk memenuhi keperluan ini.
Akibatnya, kod ini dianggap tidak betul kerana peruntukan vektor berterusan:
constexpr std::vector<int> v = {1, 2, 3};
Walau bagaimanapun, peruntukan sementara masih boleh digunakan dalam konteks constexpr. Pertimbangkan contoh ini:
constexpr int f() { std::vector<int> v = {1, 2, 3}; return v.size(); } static_assert(f() == 3);
Dalam keadaan ini, peruntukan memori vektor adalah sementara kerana memori dilepaskan apabila f() kembali. Oleh itu, adalah dibenarkan untuk menggunakan std::vectors semasa penilaian constexpr, dengan syarat peruntukan adalah sementara.
Atas ialah kandungan terperinci Mengapa Vektor dan Rentetan `constexpr` dalam C 20 Membawa kepada Ralat Peruntukan Sementara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!