ホームページ > バックエンド開発 > C++ > 呼び出されていないテンプレート関数で静的アサーションが失敗するのはなぜですか?

呼び出されていないテンプレート関数で静的アサーションが失敗するのはなぜですか?

Susan Sarandon
リリース: 2024-11-12 07:58:01
オリジナル
1084 人が閲覧しました

Why Does a Static Assertion Fail in an Uncalled Template Function?

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート