Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `static_assert` Berkelakuan Berbeza dengan Parameter Templat Bukan Jenis Merentasi Pengkompil?

Mengapakah `static_assert` Berkelakuan Berbeza dengan Parameter Templat Bukan Jenis Merentasi Pengkompil?

Patricia Arquette
Patricia Arquetteasal
2024-11-05 09:02:02930semak imbas

Why Does `static_assert` Behave Differently with Non-Type Template Parameters Across Compilers?

Gelagat Tidak Konsisten static_assert dengan Parameter Templat Bukan Jenis Merentasi Penyusun

Dalam C , static_assert boleh digunakan untuk mengesahkan keadaan pada masa penyusunan . Walau bagaimanapun, pemerhatian baru-baru ini telah mendedahkan perbezaan dalam kelakuan static_assert apabila digunakan bersama dengan parameter templat bukan jenis merentas penyusun yang berbeza.

Secara khusus, coretan kod berikut:

<code class="cpp">template <int answer>
struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template <>
struct Hitchhiker<42> {};</code>

berkelakuan berbeza pada Clang dan GCC apabila cuba melumpuhkan instantiasi templat umum menggunakan static_assert. Dentang mencetuskan ralat penegasan walaupun apabila templat tidak disegerakan, manakala GCC hanya menimbulkan ralat apabila instantiasi dengan nilai parameter selain daripada 42.

Untuk memahami percanggahan, mari teroka bahagian piawai C yang berkaitan ( [temp.res]/8):

If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.

Mengikut peraturan ini, templat utama Hitchhiker tidak terbentuk kerana tiada pengkhususan yang sah boleh dihasilkan. Oleh itu, ia tidak perlu mengeluarkan diagnostik. Walau bagaimanapun, Clang memilih untuk menyediakan diagnostik walaupun kekurangan keperluan.

Jika niatnya adalah untuk mengehadkan instantiasi kepada 42 sahaja, pendekatan yang disyorkan adalah untuk meninggalkan definisi templat umum seperti berikut:

<code class="cpp">template <>
struct Hitchhiker<42> {};</code>

Atas ialah kandungan terperinci Mengapakah `static_assert` Berkelakuan Berbeza dengan Parameter Templat Bukan Jenis Merentasi Pengkompil?. 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