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:
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!