Rumah > pembangunan bahagian belakang > C++ > Mengapa Vektor dan Rentetan `constexpr` dalam C 20 Membawa kepada Ralat Peruntukan Sementara?

Mengapa Vektor dan Rentetan `constexpr` dalam C 20 Membawa kepada Ralat Peruntukan Sementara?

Linda Hamilton
Lepaskan: 2024-12-03 06:20:14
asal
307 orang telah melayarinya

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

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

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

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

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!

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