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