Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menyelesaikan Ralat \'Bukan Jenis Templat Bukan Ungkapan Malar\' dalam Fungsi Constexpr dengan Rujukan?

Bagaimanakah Saya Boleh Menyelesaikan Ralat \'Bukan Jenis Templat Bukan Ungkapan Malar\' dalam Fungsi Constexpr dengan Rujukan?

Linda Hamilton
Linda Hamiltonasal
2024-12-04 02:30:09492semak imbas

How Can I Resolve

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:

  • Tidak mempunyai pemulaan sebelumnya
  • Dicipta sebelum penilaian ungkapan malar

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!

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