テンプレートのインスタンス化における 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 サイトの他の関連記事を参照してください。