ホームページ >バックエンド開発 >C++ >テンプレートのインスタンス化における「static_assert」の動作は、GCC と Clang で異なりますか?

テンプレートのインスタンス化における「static_assert」の動作は、GCC と Clang で異なりますか?

DDD
DDDオリジナル
2024-11-05 01:10:01594ブラウズ

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

テンプレートのインスタンス化における static_assert の動作の評価

このコードでは、非型テンプレート パラメーターの値を検証するために static_assert が使用されています。答え。ただし、このアサーションの動作は gcc と clang の間で異なります。

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

template <> struct Hitchhiker<42> {};</code>

gcc の動作:

gcc は、Hitchhiker を 以外のパラメータでインスタンス化する場合にのみアサーションをトリガーします。 42.

clang の動作:

clang は、テンプレートが明示的にインスタンス化されていない場合でもアサーション エラーを発生させます。

標準解釈:

C 標準では、テンプレートに有効な特殊化がなく、インスタンス化されていない場合、そのテンプレートは不正な形式であるとみなされると規定されています。これは、診断が必要ないことを意味します。

分析:

両方のコンパイラの動作は正しいです。 Clang は、標準では診断が必要ではないにもかかわらず、診断を提供することを選択します。

代替アプローチ:

回答 42 のみを許可するには、一般テンプレートを省略できます。 、および次のように定義された特殊なテンプレート:

<code class="cpp">template <> struct Hitchhiker<42> {};</code>

以上がテンプレートのインスタンス化における「static_assert」の動作は、GCC と Clang で異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。