ホームページ  >  記事  >  バックエンド開発  >  Null 関数の呼び出しにもかかわらず、静的アサーションがコンパイルに失敗するのはなぜですか?

Null 関数の呼び出しにもかかわらず、静的アサーションがコンパイルに失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-06 00:09:02295ブラウズ

Why Does a Static Assertion Fail Compilation Despite a Null Function Invocation?

Null 関数の呼び出しにもかかわらず、静的アサーションがコンパイルに失敗する

c 0x フラグを指定して g 4.6.3 を使用すると、開発者が予期しないコンパイル エラーに遭遇しました:

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

結果:

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

このエラーは、コード内のどこにも関数が呼び出されていなくても発生します。

説明

C 標準 [temp.res]/8 によれば、インスタンス化されていないテンプレート定義に対して有効な特殊化を生成できない場合、テンプレートは不正形式です。コンパイラにはこのエラーを診断する義務はありませんが、テンプレートを拒否することは許可されています。

解決策

この問題を解決する 1 つのアプローチは、型特性を使用することです。静的アサーションを保護するため:

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

この変更により、コンパイラは foobar の関連する特殊化をインスタンス化する必要があるため、テンプレートをすぐに拒否できなくなります。静的アサーションの値を決定しますが、意図したとおりに失敗します。

以上がNull 関数の呼び出しにもかかわらず、静的アサーションがコンパイルに失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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