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

Susan Sarandon
Lepaskan: 2024-11-06 10:54:02
asal
494 orang telah melayarinya

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!