Rumah > pembangunan bahagian belakang > C++ > Adakah Gelagat `static_assert` Berbeza-beza dalam Instantiasi Templat Antara GCC dan Clang?

Adakah Gelagat `static_assert` Berbeza-beza dalam Instantiasi Templat Antara GCC dan Clang?

DDD
Lepaskan: 2024-11-05 01:10:01
asal
611 orang telah melayarinya

Does `static_assert` Behavior Vary in Template Instantiation Between GCC and Clang?

Penilaian static_assert Gelagat dalam Templat Instantiation

Dalam kod ini, static_assert digunakan untuk mengesahkan nilai parameter templat bukan jenis jawab. Walau bagaimanapun, gelagat penegasan ini berbeza antara gcc dan clang:

<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

Gelagat gcc:

gcc hanya mencetuskan penegasan apabila menginstant Hitchhiker dengan parameter selain daripada 42.

Gelagat clang:

clang menimbulkan ralat penegasan walaupun templat tidak dinyatakan secara eksplisit.

Tafsiran Standard:

Piawaian C menyatakan bahawa jika templat tidak mempunyai pengkhususan yang sah dan tidak dijadikan instantiated, templat tersebut dianggap salah bentuk. Ini bermakna tiada diagnostik diperlukan.

Analisis:

Kedua-dua penyusun adalah betul dalam tingkah laku mereka. Clang memilih untuk menyediakan diagnostik walaupun piawaian tidak memerlukannya.

Pendekatan Alternatif:

Untuk membenarkan jawapan sebanyak 42 sahaja, templat umum boleh ditinggalkan , dan templat khusus yang ditakrifkan seperti berikut:

<code class="cpp">template <> struct Hitchhiker<42> {};</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Adakah Gelagat `static_assert` Berbeza-beza dalam Instantiasi Templat Antara 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan