初期化リストを使用して明示的なテンプレート コンストラクターを呼び出す方法
質問:
明示的なテンプレートを使用できますコンストラクターは、次のように初期化子リストを使用して呼び出されます。例?
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 サイトの他の関連記事を参照してください。