呼び出されていないテンプレート関数にもかかわらず、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 サイトの他の関連記事を参照してください。