Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-05 09:02:02
asal
1111 orang telah melayarinya

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

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

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

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 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