Mengapa Saya Tidak Boleh Menggunakan Parameter Fungsi bagi Fungsi `constexpr` dalam Ungkapan Malar?

Mary-Kate Olsen
Lepaskan: 2024-11-14 15:06:02
asal
967 orang telah melayarinya

Why Can't I Use a Function Parameter of a `constexpr` Function in a Constant Expression?

Tidak Boleh Menggunakan Parameter Fungsi bagi Fungsi constexpr dalam Ungkapan Malar

Pengenalan Masalah dan Contoh Kod

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

Penjelasan dan Pendekatan

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.

Memahami Fungsi constexpr

Fungsi constexpr mempamerkan dua ciri utama:

  • Dokumentasi: Ia menunjukkan kepada pengkompil bahawa fungsi itu, jika diberikan argumen constexpr dan melaksanakan tanpa kelakuan yang tidak ditentukan, boleh dinilai pada masa penyusunan.
  • Arahan: Ia menggesa pengkompil untuk menilai fungsi pada masa penyusunan jika ia digunakan dalam konteks khusus yang memerlukan ungkapan constexpr.

Resolusi

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

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!

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