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