Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa `jika constexpr` Tidak Berfungsi Seperti Yang Dijangkakan dalam Fungsi C Bukan Templat?

Mengapa `jika constexpr` Tidak Berfungsi Seperti Yang Dijangkakan dalam Fungsi C Bukan Templat?

Susan Sarandon
Susan Sarandonasal
2024-11-06 10:54:02496semak imbas

Why Doesn't `if constexpr` Work as Expected in Non-Templated C   Functions?

jika constexpr dalam C 17 Tidak Berfungsi dalam Fungsi Bukan Templat

Pengenalan

The Piawaian C 17 memperkenalkan konstruk if constexpr, yang membenarkan pelaksanaan bersyarat berdasarkan ungkapan malar. Walau bagaimanapun, telah diperhatikan bahawa jika tingkah laku constexpr berbeza apabila digunakan dalam fungsi templat berbanding bukan templat.

Masalah

Pertimbangkan fungsi bukan templat berikut:

<code class="cpp">void print()
{
  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;
  }
}</code>

Kod ini mengakibatkan ralat kompilasi kerana *nilai tidak sah untuk int jenis yang disimpulkan.

Jawapan

Tingkah laku ini adalah mengikut reka bentuk. Dalam fungsi templat, jika constexpr boleh mengelakkan cawangan instantiate yang tidak sah untuk pengkhususan templat tertentu. Walau bagaimanapun, dalam fungsi bukan templat, jika constexpr tidak menyekat kompilasi cawangan yang tidak diambil.

Kedua-dua cabang pernyataan if constexpr dihuraikan dan dianalisis, walaupun cawangan tidak diambil adalah tidak sah. Oleh itu, dalam kod di atas, pengkompil akan cuba menilai *nilai untuk jenis int, mengakibatkan ralat.

Kesimpulan

Perbezaan ini penting untuk difahami apabila menggunakan if constexpr. Dalam fungsi bukan templat, ia hanya boleh digunakan untuk menyemak ungkapan malar yang dijamin sah untuk semua kemungkinan nilai parameter input.

Atas ialah kandungan terperinci Mengapa `jika constexpr` Tidak Berfungsi Seperti Yang Dijangkakan dalam Fungsi C Bukan Templat?. 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