ホームページ >バックエンド開発 >C++ >初期化子リストを使用して明示的なテンプレート コンストラクターを呼び出すことはできますか?

初期化子リストを使用して明示的なテンプレート コンストラクターを呼び出すことはできますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 16:56:10809ブラウズ

Can Explicit Template Constructors Be Invoked Using Initializer Lists?

初期化リストを使用して明示的なテンプレート コンストラクターを呼び出す方法

質問:

明示的なテンプレートを使用できますコンストラクターは、次のように初期化子リストを使用して呼び出されます。例?

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

struct U {
    U() : t<void>() {} //does not work
    T t;
};

答え:

残念ながら、初期化子リストを使用してテンプレート コンストラクターを明示的に呼び出すことはできません。

C によると14.8.1/7 の標準では、「[...] 変換メンバー関数テンプレートとコンストラクター メンバーのため関数テンプレートは関数名を使用せずに呼び出されるため、これらの関数テンプレートに明示的なテンプレート引数リストを提供する方法はありません。"

これは、独自の名前がないコンストラクターはテンプレート引数を明示的に受け入れることができないことを意味します。あなたの場合、コンパイラは t を解釈します。

この問題に対処するには、次の回避策を採用できます。

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

struct U {
    U() : t(identity<void>()) {}
    T t;
};

ここでは、ID がテンプレート パラメーターのプレースホルダーとして機能します。 。 C 20 内では、アイデンティティ タイプとして std::type_identity を使用できます。

以上が初期化子リストを使用して明示的なテンプレート コンストラクターを呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。