非型テンプレート パラメーターに対する「static_assert」の動作がコンパイラーごとに異なるのはなぜですか?

Patricia Arquette
リリース: 2024-11-05 09:02:02
オリジナル
928 人が閲覧しました

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

コンパイラー間で非型テンプレート パラメーターを使用した static_assert の動作に一貫性がない

C では、 static_assert を使用してコンパイル時に条件を検証できます。 。ただし、最近の観察により、異なるコンパイラ間で非型テンプレート パラメーターと組み合わせて使用​​した場合の static_assert の動作に差異があることが明らかになりました。

具体的には、次のコード スニペット:

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

template <>
struct Hitchhiker<42> {};</code>
ログイン後にコピー

static_assert を使用して一般的なテンプレートのインスタンス化を無効にしようとすると、Clang と GCC では動作が異なります。 Clang は、テンプレートがインスタンス化されていない場合でもアサート エラーをトリガーしますが、GCC は 42 以外のパラメーター値でインスタンス化するときにのみエラーを発生させます。

この矛盾を理解するために、C 標準の関連セクションを調べてみましょう ( [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.
ログイン後にコピー

このルールによれば、有効な特殊化を生成できないため、プライマリ テンプレート Hitchhiker は不正形式になります。したがって、診断を発行する必要はありません。ただし、要件がないにもかかわらず、Clang は診断を提供することを選択します。

インスタンス化を 42 のみに制限することが目的の場合、推奨されるアプローチは、次のように一般的なテンプレート定義を省略することです。

<code class="cpp">template <>
struct Hitchhiker<42> {};</code>
ログイン後にコピー

以上が非型テンプレート パラメーターに対する「static_assert」の動作がコンパイラーごとに異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!