ホームページ > バックエンド開発 > C++ > C イニシャライザ リストでテンプレート コンストラクタを明示的に呼び出せないのはなぜですか?

C イニシャライザ リストでテンプレート コンストラクタを明示的に呼び出せないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-29 15:12:11
オリジナル
965 人が閲覧しました

Why Can't I Explicitly Invoke Template Constructors in C   Initializer Lists?

初期化子リスト内のテンプレート コンストラクターの明示的な呼び出し

C では、初期化子リスト内でテンプレート コンストラクターを明示的に呼び出すことはできません。次の例を考えてみましょう:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};
ログイン後にコピー

C 標準ではコンストラクター メンバー関数テンプレートの明示的なテンプレート引数リストが明示的に禁止されているため、このコードはコンパイルに失敗します。これは、関数名を持たないコンストラクターの一意の構文によるものです。

説明: C 標準のセクション 14.8.1/7 では、

と規定されています。 「明示的なテンプレート引数リストは関数テンプレート名に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、関数を提供する方法はありません。これらの関数テンプレートの明示的なテンプレート引数リスト。"

回避策: 初期化子リスト内でテンプレート コンストラクターの明示的な呼び出しが必要な場合は、カスタム タイプを使用して回避策を採用できます。テンプレート パラメーターを引数として受け入れるコンストラクター:

struct T { 
    template<class U> T(identity<U>);
};

struct U {
    U() : t(identity<void>()) {}
    T t;
};
ログイン後にコピー

この場合、Boost ライブラリからの ID タイプまたはC 20 の std::type_identity を使用して、テンプレート パラメーターの型を表すことができます。これにより、このカスタム タイプのオブジェクトを使用して、テンプレート コンストラクターを間接的に呼び出すことができます。

以上がC イニシャライザ リストでテンプレート コンストラクタを明示的に呼び出せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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