次のテンプレート関数について考えてみましょう。
template <typename T> inline T getValue(AnObject&) { static_assert(false, "this function has to be implemented for desired type"); }
呼び出していないにもかかわらず、g 4.6.3 でコンパイルする場合この関数をどこに置いてもコンパイルは失敗します。 error:
static_assertion failed "this function has to be implemented for the desired type"
関数は呼び出されず、コンパイル エラーが発生するはずがないため、この動作では疑問が生じる可能性があります。ただし、[temp.res]/8 の C 標準によれば:
If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
コンパイルされる有効な特殊化を使用して関数テンプレートをインスタンス化する実現可能な方法がないため、テンプレート定義自体が考慮されます。形が悪い。これにより、コンパイラはインスタンス化が行われる前でもそれを拒否できます。
この問題を解決し、遅延エラー検出を可能にするために、テンプレート関数を次のように変更できます。
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"); }
次のように使用します。追加のテンプレート struct foobar をコンパイル時フラグとして使用すると、コンパイラーは関数テンプレートをすぐに拒否できません。インスタンス化されると、foobar
以上が呼び出されていないテンプレート関数で静的アサーションが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。