Mengapa Gelagat `static_assert` Berbeza-beza Antara GCC dan Clang Apabila Bergantung pada Parameter Templat Bukan Jenis?

Patricia Arquette
Lepaskan: 2024-11-05 14:13:02
asal
373 orang telah melayarinya

Why Does `static_assert` Behavior Vary Between GCC and Clang When Dependent on a Non-Type Template Parameter?

static_assert Bergantung pada Non-Type Template Parameter: Variasi Gelagat dalam GCC dan Clang

Dalam C , makro static_assert digunakan untuk mengesahkan penyusunan -keadaan masa. Apabila syarat gagal, atur cara ditamatkan dengan mesej ralat.

Pertimbangkan 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

Kod ini cuba melumpuhkan instantiasi templat umum dengan static_assert. Walau bagaimanapun, kelakuannya berbeza antara penyusun:

  • GCC (4.9.2): Melemparkan ralat penegasan hanya apabila membuat seketika Hitchhiker dengan parameter selain daripada 42.
  • Clang (3.50): Membuang ralat walaupun apabila templat tidak dibuat seketika.

Perspektif Standard

Piawaian C menentukan bahawa templat tidak terbentuk jika tiada pengkhususan yang sah dapat dijana dan ia tidak dibuat seketika. Dalam kes ini, tiada pengkhususan yang sah untuk templat Hitchhiker, jadi ia tidak betul dari segi teknikal.

Walau bagaimanapun, piawaian tidak memerlukan diagnostik untuk dikeluarkan dalam kes sedemikian.

Pelaksanaan Penyusun

GCC memilih untuk mematuhi piawaian dengan ketat, tidak mengeluarkan diagnostik apabila templat tidak dibuat seketika (kerana ia sudah tidak betul).

Dentang, sebaliknya, memberikan pengalaman yang lebih mesra pengguna dengan mengeluarkan diagnostik walaupun templat tidak dibuat seketika. Ini membantu pembangun mengenal pasti isu yang berpotensi lebih awal dalam proses penyusunan.

Amalan Terbaik

Untuk mengelakkan percanggahan ini, adalah disyorkan untuk mengkhususkan templat secara eksplisit untuk nilai parameter yang diingini bukannya menggunakan static_assert untuk melumpuhkan instantiasi templat umum. Pendekatan ini memastikan tingkah laku yang konsisten merentas penyusun.

Contohnya:

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

Atas ialah kandungan terperinci Mengapa Gelagat `static_assert` Berbeza-beza Antara GCC dan Clang Apabila Bergantung pada Parameter Templat Bukan Jenis?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!