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