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
Lepaskan: 2024-11-29 07:53:13
asal
610 orang telah melayarinya

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

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

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!

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