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
Lepaskan: 2024-11-15 08:57:02
asal
630 orang telah melayarinya

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;
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan