Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada Fungsi Constexpr?

Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada Fungsi Constexpr?

Susan Sarandon
Susan Sarandonasal
2024-11-15 08:57:02616semak imbas

Why Can't I Pass Non-Constexpr Arguments to a Constexpr Function?

Penghadan Parameter Fungsi Constexpr dalam Ungkapan Malar

Pertimbangkan coretan kod:

static constexpr int make_const(const int i){
    return i;
}

void t1(const int i)
{
    constexpr int ii = make_const(i);  // error occurs here (i is not a constant expression)
    std::cout<<ii;
}

Ralat Butiran

Kod mencetuskan ralat semasa cuba memulakan ii dengan make_const(i) kerana i bukan ungkapan malar. Ini kerana:

  • Pembolehubah constexpr ialah pembolehubah dengan nilai yang dijamin tersedia pada masa penyusunan.
  • Fungsi constexpr ialah fungsi yang menilai pada masa penyusunan apabila disediakan dengan argumen constexpr.

Mengirim parameter bukan constexpr kepada fungsi constexpr tidak menghasilkan output constexpr. Walau bagaimanapun, fungsi constexpr boleh mewarisi dan menyebarkan constexprness parameter inputnya.

Senario Dibenarkan

Kod berikut berfungsi kerana kedua-dua t1() dan make_const() adalah constexpr berfungsi dengan constexpr parameter:

constexpr int t1(const int i)
{
    return make_const(i);
}

Limitation

Kod berikut gagal kerana do_something() bukan fungsi constexpr, walaupun make_const() ialah:

template<int i>
constexpr bool do_something(){
    return i;
}

constexpr int t1(const int i)
{
    return do_something<make_const(i)>();   // error occurs here (i is not a constant expression)
}

Kesimpulan

Memahami perbezaan antara fungsi constexpr dan pembolehubah adalah penting untuk mengelakkan ralat tersebut. Fungsi Constexpr menawarkan fleksibiliti untuk dinilai pada masa kompilasi dan masa jalan, tetapi hanya dengan argumen constexpr.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada 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