Rumah >pembangunan bahagian belakang >C++ >Mengapa Parameter Rujukan Menyebabkan Ralat dalam Fungsi Constexpr?
Kekeliruan terhadap Parameter Rujukan dalam Fungsi Constexpr
Coretan kod di bawah cuba menggabungkan dua tatasusunan bait menjadi tatasusunan baharu dalam fungsi constexpr dinamakan concatenate.
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 occurs here // ... }
Namun, apabila disusun dengan Clang 6.0 menggunakan piawaian C 17, ralat berlaku: "hujah templat bukan jenis bukan ungkapan tetap." Ralat ini berpunca daripada sifat rujukan parameter fungsi (data1 dan data2).
Jenis rujukan dalam parameter fungsi mencetuskan isu kerana ungkapan malar tidak dapat menilai rujukan, seperti yang dinyatakan dalam piawaian C di bawah [expr. const]/4:
"Ungkapan e ialah ungkapan teras teras melainkan penilaian e... akan menilai ungkapan id yang merujuk kepada pembolehubah atau data ahli jenis rujukan melainkan rujukan mempunyai pemulaan terdahulu."
Memandangkan parameter rujukan dalam kes ini tidak mempunyai pemulaan terdahulu, ia tidak boleh digunakan dalam ungkapan tetap.
Untuk membetulkan isu ini, kod boleh diubah suai untuk menggunakan parameter templat S1 dan S2 secara langsung dan bukannya bergantung pada ahli saiz() parameter rujukan fungsi:
std::array<uint8_t, S1 + S2> result;
Atas ialah kandungan terperinci Mengapa Parameter Rujukan Menyebabkan Ralat dalam Fungsi Constexpr?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!