テンプレート static_assert を使用する場合、テンプレート関数がインスタンス化された場合にのみアサーションが失敗することが予想されます。ただし、以下に挙げたような特定のケースでは、関数が呼び出される前であってもコンパイルが失敗します。
template <typename T> inline T getValue(AnObject&) { static_assert(false , "this function has to be implemented for desired type"); }
[temp.res]/ の C 標準によると、 8:
「テンプレート定義に対して有効な特殊化を生成できず、そのテンプレートがインスタンス化されない場合、テンプレート定義は不正な形式であるため、診断は行われませんrequired."
提供されたテンプレートでは、static_assert 条件が常に false であるため、有効な特殊化を生成できません。したがって、テンプレート定義の形式が正しくありません。インスタンス化されていない場合でも、コンパイラが早期に拒否する可能性があります。
この問題を解決するには、テンプレートを次のように変更できます。
template<typename T> struct foobar : std::false_type { }; template <typename T> inline T getValue(AnObject&) { static_assert( foobar<T>::value , "this function has to be implemented for desired type"); }
この方法の場合、コンパイラは、static_assert 条件を評価する前に foobar の適切な特殊化をインスタンス化する必要があるため、関数テンプレートをすぐに拒否することはできません。その結果、コンパイル エラーは、関数が実際にインスタンス化され、アサーションが失敗した場合にのみ発生します。
以上が`static_assert` が呼び出されていないテンプレート関数のコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。