Rumah >pembangunan bahagian belakang >C++ >Mengapa `data1.size()` Tidak Berfungsi dalam Fungsi `constexpr` dengan Parameter Rujukan?

Mengapa `data1.size()` Tidak Berfungsi dalam Fungsi `constexpr` dengan Parameter Rujukan?

Patricia Arquette
Patricia Arquetteasal
2024-11-29 07:53:13650semak imbas

Why Doesn't `data1.size()` Work in a `constexpr` Function with Reference Parameters?

Ungkapan Malar dalam Fungsi Constexpr dengan Parameter Rujukan

Pertimbangkan coretan kod berikut:

template <size_t S1, size_t S2>
auto concatenate(const std::array<uint8_t, S1> &data1,
                 const std::array<uint8_t, S2> &data2)
{
    std::array<uint8_t, data1.size() + data2.size()> result; // Error: non-type template argument is not a constant expression
    ...
}

Apabila disusun menggunakan dentang 6.0 dengan -std=c 17, fungsi gagal kompilkan disebabkan oleh fungsi ahli saiz tatasusunan yang tidak menjadi constexpr apabila digunakan pada rujukan.

Rasional Standard

Sebab bagi tingkah laku ini dijelaskan dalam [expr. const]/4 piawai C:

  • Ungkapan bukan ungkapan malar teras jika ia menilai id-ungkapan yang merujuk kepada pembolehubah atau ahli data jenis rujukan melainkan:

    • Rujukan mempunyai pemulaan terdahulu dan boleh digunakan dalam ungkapan tetap
    • Hayat rujukan bermula dalam penilaian ungkapan

Dalam kes ini, data parameter rujukan1 tidak mempunyai pemulaan sebelumnya, jadi ia tidak boleh digunakan dalam ungkapan malar data1.size() data2.size().

Penyelesaian

Untuk menyelesaikan isu, cuma gantikan data1.size() dengan parameter templat S1:

std::array<uint8_t, S1 + S2> result;

Atas ialah kandungan terperinci Mengapa `data1.size()` Tidak Berfungsi dalam Fungsi `constexpr` dengan Parameter Rujukan?. 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