Rumah > pembangunan bahagian belakang > C++ > Mengapa 'jika constexpr' menyebabkan ralat dalam fungsi bukan templat dalam C 17?

Mengapa 'jika constexpr' menyebabkan ralat dalam fungsi bukan templat dalam C 17?

Barbara Streisand
Lepaskan: 2024-11-06 03:58:02
asal
864 orang telah melayarinya

Why does

Ralat "If constexpr" dalam Fungsi Bukan Templat dalam C 17

Pengenalan

C 17 memperkenalkan if constexpr kata kunci, membenarkan kompilasi bersyarat berdasarkan pemalar masa kompilasi. Walau bagaimanapun, ralat yang tidak dijangka boleh timbul apabila menggunakan if constexpr dalam fungsi bukan templat. Artikel ini meneroka isu ini dan menyediakan penyelesaian.

Contoh Kod

Pertimbangkan kod berikut:

<code class="cpp">#include <iostream>
#include <type_traits>

int main() {
  auto value = 100;
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl; // Error
  else
    std::cout << "Ref to " << value << std::endl;
}
Salin selepas log masuk

Ralat Penyusunan

Kod ini menjana ralat kompilasi apabila pernyataan if constexpr berada dalam fungsi utama:

main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’)
std::cout << "Ptr to " << *value << std::endl;
Salin selepas log masuk

Penjelasan

Jika constexpr sahaja berfungsi dalam fungsi templat kerana ia membenarkan pengkompil untuk mengelakkan cawangan instantiating yang tidak diambil pada masa penyusunan. Pengoptimuman ini penting untuk pengaturcaraan meta templat yang cekap.

Dalam fungsi bukan templat, jika constexpr masih menilai kedua-dua cabang, walaupun jenis itu disimpulkan oleh decltype. Ini bermakna ralat dalam kod di atas disebabkan oleh percubaan untuk menyahrujuk nilai int dalam cawangan if.

Penyelesaian

Untuk menyelesaikan isu ini, anda boleh alihkan pernyataan if constexpr ke dalam fungsi templat. Contohnya:

<code class="cpp">template <typename T>
void print(T value) {
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}

int main() {
  auto value = 100;
  print(value);
}</code>
Salin selepas log masuk

Kod yang diubah suai ini akan menyusun dan mencetak output yang dijangkakan:

Ref to 100
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa 'jika constexpr' menyebabkan ralat dalam fungsi bukan templat dalam C 17?. 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