Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Saya Tidak Boleh Menggunakan `if constexpr` dalam Fungsi Bukan Templat dalam C 17?

Mengapakah Saya Tidak Boleh Menggunakan `if constexpr` dalam Fungsi Bukan Templat dalam C 17?

Susan Sarandon
Susan Sarandonasal
2024-11-06 04:13:02489semak imbas

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

C 17 "if constexpr" Terhad kepada Fungsi Templat

Dalam C 17, pengenalan "if constexpr" telah mencetuskan minat terhadapnya keupayaan untuk melaksanakan kod secara bersyarat berdasarkan pemalar masa kompilasi. Walau bagaimanapun, isu timbul apabila cuba menggunakannya dalam fungsi bukan templat.

Pertimbangkan kod berikut:

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

void print(auto value)
{
  // Compile-time check if value is a pointer
  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()
{
  // Error when printing a non-pointer
  print(100);
}</code>

Semasa kod ini menyusun tanpa ralat dalam fungsi templat, ia gagal dengan ralat penyusunan apabila diletakkan dalam fungsi bukan templat seperti cetakan. Sebabnya terletak pada kelakuan "if constexpr."

"if constexpr" direka bentuk untuk membenarkan kompilasi bersyarat bagi kod templat. Dalam fungsi templat, pengkompil menyimpulkan jenis parameter pada masa penyusunan, membolehkan pemilihan laluan kod yang sesuai berdasarkan jenis. Dalam kes ini, apabila fungsi cetakan templat, ia boleh mengenal pasti sama ada nilai ialah penunjuk pada masa penyusunan dan melaksanakan cawangan kod yang sepadan.

Walau bagaimanapun, dalam fungsi bukan templat, jenis nilai diketahui hanya pada masa larian, menjadikan "if constexpr" tidak berkesan. Pengkompil menganggap kedua-dua cawangan bersyarat sebagai kod boleh laku, yang membawa kepada ralat kompilasi apabila cuba menyahrujuk nilai dalam Ptr kepada cawangan apabila nilai ialah integer.

Untuk mengelakkan isu ini, perlu meletakkan " if constexpr" dalam fungsi templat atau berikan maklumat jenis eksplisit kepada fungsi bukan templat untuk memastikan potongan jenis masa kompilasi.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menggunakan `if constexpr` dalam Fungsi Bukan Templat dalam C 17?. 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