コンパイラー間で非型テンプレート パラメーターを使用した 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 サイトの他の関連記事を参照してください。