ホームページ > バックエンド開発 > C++ > 型以外のテンプレート パラメーターを指定した `static_assert` が GCC と Clang で異なる動作をするのはなぜですか?

型以外のテンプレート パラメーターを指定した `static_assert` が GCC と Clang で異なる動作をするのはなぜですか?

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

Why Does `static_assert` with Non-Type Template Parameters Behave Differently in GCC and Clang?

型以外のテンプレート パラメーターを使用した静的アサート

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>
ログイン後にコピー

GCC と Clang を使用してコンパイルすると、異なる結果が生成されます。 GCC では、アサーション エラーは、42 以外のパラメータで Hitchhiker をインスタンス化する場合にのみ生成されます。Clang では、テンプレートがインスタンス化されない場合でもアサーション エラーが生成されます。

アサーションを次のように変更します。

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

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

結果として、アサーションはテンプレートのインスタンス化中にのみチェックされ、両方のコンパイラ間で一貫した動作が行われます。

答え:

C 標準によると ( [temp.res]/8)、有効な特殊化のないインスタンス化されていないテンプレートは、診断の要件がなければ、不正な形式とみなされます。

結論:

元のコードの場合、GCC はインスタンス化されていないテンプレートに対して診断を発行しないことを選択します。一方、Clang は、標準では要求されていないにもかかわらず、診断を発行することを決定します。アサーションはテンプレートが実際にインスタンス化されるときにのみチェックされるため、変更されたコードの動作はコンパイラ間でより一貫性があります。

このシナリオでの診断の有無はエラーを示すものではないことに注意することが重要です。コードで。インスタンス化されていないテンプレートは本質的に不正な形式であるため、無効な特殊化を使用してテンプレートをインスタンス化しようとすると、コンパイル エラーが発生します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート