Kod yang disediakan menunjukkan percubaan untuk gunakan nilai pulangan fungsi constexpr make_const dalam ungkapan malar, tetapi ia menghadapi ralat.
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; } int main() { t1(12); // Call the function }
Fungsi constexpr, bertentangan dengan kepercayaan popular, tidak ajaib membuat parameternya dinilai pada masa penyusunan. Sebaliknya, ia membenarkan penyebaran constexprness daripada argumen inputnya kepada outputnya. Walau bagaimanapun, dalam kod yang diberikan, parameter fungsi i bukan constexpr, jadi fungsi constexpr make_const tidak boleh menukarnya menjadi satu.
Ralat timbul kerana tugasan seterusnya constexpr int ii = make_const(i) cuba untuk mengisytiharkan pembolehubah constexpr (ii) dimulakan dengan hasil ungkapan bukan constexpr (make_const(i)). Ini tidak dibenarkan, kerana pembolehubah constexpr mesti sentiasa dimulakan dengan ungkapan constexpr.
Fungsi constexpr mempamerkan dua ciri utama:
Untuk menyelesaikan ralat, seseorang boleh memastikan bahawa parameter fungsi itu sendiri adalah constexpr . Ini boleh dicapai dengan mengubah suai pengisytiharan fungsi kepada:
constexpr int make_const(constexpr int i) { return i; }
Pindaan ini menjamin bahawa fungsi boleh menukar input constexprnya dengan berkesan kepada output constexpr, membolehkan penggunaan fungsi yang dimaksudkan dalam ungkapan malar.
Dalam contoh kod alternatif yang disediakan, fungsi make_const boleh digunakan sebagai ungkapan constexpr dalam t1 kerana parameternya kini constexpr. Walau bagaimanapun, cubaan untuk menghantar hasil ungkapan bukan constexpr (seperti pembolehubah masa jalan) ke dalam fungsi masih akan mengakibatkan ralat, kerana fungsi memerlukan argumen constexpr untuk pelaksanaan constexprnya.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Parameter Fungsi bagi Fungsi `constexpr` dalam Ungkapan Malar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!