Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Consteval Membenarkan Parameter Templat Bergantung pada Argumen Fungsi?

Bolehkah Fungsi Consteval Membenarkan Parameter Templat Bergantung pada Argumen Fungsi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-24 01:35:01452semak imbas

Can Consteval Functions Allow Template Parameters Reliant on Function Arguments?

Bolehkah Fungsi Consteval Mendayakan Parameter Templat Bersandar pada Argumen Fungsi?

Dalam C 17, fungsi constexpr seperti coretan di bawah adalah tidak sah:

<code class="cpp">constexpr int foo(int i) {
    return std::integral_constant<int, i>::value;
}</code>

Walaupun penilaian foo pada masa penyusunan, pengkompil memerlukan ia boleh dilaksanakan pada masa jalan, menghalang instantiasi templat.

C 20 memperkenalkan fungsi konsteval, yang menguatkuasakan penilaian masa kompilasi. Seseorang mungkin tertanya-tanya sama ada ini membenarkan kod seperti berikut:

<code class="cpp">consteval int foo(int i) {
    return std::integral_constant<int, i>::value;
}</code>

Jawapannya tidak.

Potensi perubahan kertas tidak boleh mengubah taip tunggal bukan templat definisi fungsi. Tambahan pula, jika kod ini sah, ia akan membuka kemungkinan untuk mengisytiharkan pembolehubah jenis std::integral_constant, yang kelihatan sangat terhad dari segi Peraturan Satu Definisi (ODR).

Makalah ini juga menggambarkan bahawa parameter tidak akan dianggap sebagai ungkapan malar teras melalui contoh:

<code class="cpp">consteval int sqrsqr(int n) {
  return sqr(sqr(n)); // Not a constant-expression at this point, but that's okay.
}</code>

Pada dasarnya, parameter fungsi akan sentiasa kekurangan status ekspresi malar disebabkan kemungkinan ketidakkonsistenan menaip.

Atas ialah kandungan terperinci Bolehkah Fungsi Consteval Membenarkan Parameter Templat Bergantung pada Argumen Fungsi?. 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