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

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

Susan Sarandon
リリース: 2024-12-18 03:56:09
オリジナル
457 人が閲覧しました

Why Can't I Explicitly Invoke a Template Constructor in a C   Initializer List?

C での明示的なテンプレート コンストラクターの呼び出し

C では、初期化子リストでテンプレート コンストラクターを明示的に呼び出すことはできません。これは、テンプレート引数に使用される特定の構文が原因であり、構築中に括弧内に含まれるのではなく、関数テンプレート名に続きます。

C 標準 (14.8.1/7) に記載されているとおり、

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

したがって、次の例は機能しません。

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

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

この場合、コンパイラーは t を解釈しようとします。

回避策

この制限を回避するには、次の関数テンプレートを使用できます。引数としての ID タイプ:

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

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

次の ID 定義が与えられるとします。 Boost:

template<typename T> struct identity { typedef T type; };
ログイン後にコピー

または、C 20 では std::type_identity:

using ::std::type_identity;
ログイン後にコピー

を使用すると、このアプローチにより、初期化子リストのコンストラクターにテンプレート引数を効果的に渡すことができます。

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

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