Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa "if constexpr" Menyebabkan Ralat Penyusunan dalam Fungsi Bukan Templat dalam C 17?

Mengapa "if constexpr" Menyebabkan Ralat Penyusunan dalam Fungsi Bukan Templat dalam C 17?

Linda Hamilton
Linda Hamiltonasal
2024-11-06 03:20:02774semak imbas

Why Does

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

Dalam C 17, pernyataan "if constexpr" membenarkan untuk menilai dan menyusun kod secara bersyarat berdasarkan ungkapan malar. Walau bagaimanapun, ciri ini mempunyai had apabila digunakan dalam fungsi bukan templat.

Kod:

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

void print(auto value)
{
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}</code>

Masalah:

Apabila "if constexpr" digunakan dalam fungsi bukan templat, seperti yang ditunjukkan di atas, ralat kompilasi berlaku apabila cuba menyahrujuk nilai bukan penuding. Ralat ini timbul kerana, tidak seperti dalam fungsi templat, "if constexpr" dalam fungsi bukan templat tidak menghalang penyusunan laluan kod yang tidak diambil.

Penjelasan:

Dalam fungsi templat, "if constexpr" membenarkan kod disusun secara bersyarat berdasarkan nilai parameter templat. Dalam kes ini, pengkompil boleh menentukan pada masa penyusunan sama ada templat itu sah untuk pengkhususan tertentu dan hanya membuat seketika laluan kod yang diperlukan.

Walau bagaimanapun, dalam fungsi bukan templat, "if constexpr" bertindak hanya sebagai pernyataan bersyarat pada masa jalan. Pengkompil masih menganalisis kedua-dua cawangan pernyataan bersyarat dan jika mana-mana kod dalam cawangan yang tidak diambil adalah tidak sah, ralat penyusunan akan berlaku.

Penyelesaian:

Untuk mengelakkan ralat ini, gunakan "if constexpr" hanya dalam fungsi templat atau dalam fungsi bukan templat yang jenisnya diketahui pada masa penyusunan dan dijamin sah untuk kedua-dua cabang pernyataan bersyarat.

Atas ialah kandungan terperinci Mengapa "if constexpr" Menyebabkan Ralat Penyusunan 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