Rumah >pembangunan bahagian belakang >C++ >Mengapa Parameter Rujukan Menyebabkan Ralat dalam Fungsi Constexpr?

Mengapa Parameter Rujukan Menyebabkan Ralat dalam Fungsi Constexpr?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-15 17:57:15935semak imbas

Why Do Reference Parameters Cause Errors in Constexpr Functions?

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!

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