Rumah >pembangunan bahagian belakang >C++ >Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada Fungsi Constexpr?
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:
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!