Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menyelesaikan Ralat \'Bukan Jenis Templat Bukan Ungkapan Malar\' dalam Fungsi Constexpr dengan Rujukan?
Merujuk Parameter Bukan Malar dalam Fungsi Constexpr
Pertimbangkan templat fungsi berikut:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Error in constexpr contexts due to reference parameter std::array<uint8_t, data1.size() + data2.size()> result; // ... }
Menggunakan Clang 6.0 dengan C 17, kod ini gagal untuk menyusun dengan ralat "hujah templat bukan jenis tidak ungkapan yang berterusan." Menilai rujukan dalam fungsi constexpr adalah bermasalah kerana potensi isu pengalianan.
Memahami Standard
Menurut Piawaian C ([expr.const]/4), sebuah ungkapan tidak boleh menjadi ungkapan teras teras jika ia menilai kepada rujukan bahawa:
Penyelesaian
Untuk menyelesaikan isu ini, seseorang boleh menggantikan parameter rujukan bermasalah dengan parameter templat yang sepadan:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Problem solved by using S1 + S2 instead std::array<uint8_t, S1 + S2> result; // ... }
Dengan menggunakan parameter templat secara langsung, kami menghapuskan keperluan untuk menilai rujukan dalam konteks constexpr dan memastikan bahawa fungsi boleh digunakan dalam penilaian ekspresi berterusan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Ralat \'Bukan Jenis Templat Bukan Ungkapan Malar\' dalam Fungsi Constexpr dengan Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!