ホームページ >バックエンド開発 >C++ >C 0x の呼び出されていないテンプレート関数で静的アサートが失敗するのはなぜですか?

C 0x の呼び出されていないテンプレート関数で静的アサートが失敗するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 16:42:03251ブラウズ

Why Does a Static Assert Fail in an Uncalled Template Function in C  0x?

呼び出されていないテンプレート関数にもかかわらず、Static_Assert が失敗する

C 0x では、未使用の static_assert 宣言を持つテンプレートによりコンパイルが失敗する可能性があります。次のコードを考えてみましょう:

template <typename T>
inline T getValue(AnObject&)
{
    static_assert(false, "this function has to be implemented for the desired type");
}

驚くべきことに、このコードは次のエラーで失敗します:

static_assertion failed "this function has to be implemented for the desired type"

直感的には、コンパイラは、テンプレート関数が呼び出された場合にのみインスタンス化すると予想されます。ただし、C 標準では [temp.res]/8:

有効な特殊化を生成できるテンプレート定義に対して診断を発行してはならないと規定しています。テンプレート定義に対して有効な特殊化が生成できず、そのテンプレートがインスタンス化されない場合、テンプレート定義は不正な形式であるため、診断は必要ありません。

コンパイルできる有効な特殊化がないため、コンパイラは許可されます。

この問題を解決するには、次のようにコードを再定義できます。

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 the desired type");
}

この変更により、診断はインスタンス化まで延期されます。適切な foobar特化し、それまでテンプレート定義が適切な形式であることを確認します。

以上がC 0x の呼び出されていないテンプレート関数で静的アサートが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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