ホームページ >バックエンド開発 >C++ >`static_assert` が呼び出されていないテンプレート関数のコンパイルに失敗するのはなぜですか?

`static_assert` が呼び出されていないテンプレート関数のコンパイルに失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 00:35:02606ブラウズ

Why Does `static_assert` Fail Compilation for an Uncalled Template Function?

呼び出されていないテンプレート関数の static_assert のコンパイルが失敗するのはなぜですか?

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

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