ホームページ >バックエンド開発 >C++ >非型テンプレート パラメーターに対する「static_assert」の動作がコンパイラーごとに異なるのはなぜですか?

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 09:02:021041ブラウズ

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 サイトの他の関連記事を参照してください。

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