Rumah > pembangunan bahagian belakang > C++ > Mengapakah `static_assert` dengan Parameter Templat Bukan Jenis Berkelakuan Berbeza dalam GCC dan Clang?

Mengapakah `static_assert` dengan Parameter Templat Bukan Jenis Berkelakuan Berbeza dalam GCC dan Clang?

Patricia Arquette
Lepaskan: 2024-11-05 01:01:02
asal
1034 orang telah melayarinya

Why Does `static_assert` with Non-Type Template Parameters Behave Differently in GCC and Clang?

Tegas Statik dengan Parameter Templat Bukan Jenis

Dalam C , static_assert digunakan untuk menyemak keadaan pada masa penyusunan. Walau bagaimanapun, pengkompil yang berbeza mempamerkan gelagat yang berbeza-beza apabila menggunakan static_assert dengan parameter templat bukan jenis.

Masalah:

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

menghasilkan hasil yang berbeza apabila disusun menggunakan GCC dan Clang. Dalam GCC, ralat penegasan hanya dijana apabila membuat seketika Hitchhiker dengan parameter selain daripada 42. Dalam Clang, ralat penegasan dijana walaupun apabila templat tidak dijadikan seketika.

Mengubah suai penegasan seperti berikut:

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

template <>
struct Hitchhiker<42> {};</code>
Salin selepas log masuk

menghasilkan tingkah laku yang konsisten antara kedua-dua penyusun, dengan penegasan hanya disemak semasa instantiasi templat.

Jawapan:

Mengikut standard C ( [temp.res]/8), templat tidak nyata tanpa pengkhususan yang sah dianggap tidak betul, tanpa memerlukan diagnostik.

Kesimpulan:

Dalam dalam kes kod asal, GCC memilih untuk tidak mengeluarkan diagnostik untuk templat yang tidak segera. Clang, sebaliknya, memutuskan untuk mengeluarkan diagnostik walaupun standard tidak memerlukannya. Tingkah laku kod yang diubah suai adalah lebih konsisten antara pengkompil kerana penegasan hanya disemak apabila templat benar-benar dibuat seketika.

Adalah penting untuk ambil perhatian bahawa kehadiran atau ketiadaan diagnostik dalam senario ini tidak menunjukkan ralat dalam kod. Templat yang tidak dibuat secara semula jadi adalah bentuk yang tidak betul, dan sebarang percubaan untuk mewujudkannya dengan pengkhususan yang tidak sah akan mengakibatkan ralat penyusunan.

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