クラス コンストラクター テンプレート推論論争
テンプレート パラメーターは、次のコードのように関数の引数から簡単に推論できます。
template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
ただし、同様のアプローチはクラス コンストラクターでは許可されていないため、問題が生じています。 Cプログラマー。なぜそうではないのでしょうか?
この矛盾の背後にある理由は、オブジェクト構築の複雑さにあります。コンストラクターはクラスの唯一のエントリ ポイントではありません。コピー コンストラクターと代入演算子も重要な役割を果たしており、コンストラクターのみからテンプレート パラメーターを推論するとあいまいさが生じる可能性があります。
次の例を考えてみましょう。
template <typename T> class Variable { T data; public: Variable(T d) { data = d; } };
テンプレート推論が許可されている場合、次のコードは有効です:
Variable var(2); // Equivalent to Variable<int> var(2);
しかし、コピー構築または代入を使用した場合はどうなるでしょうか。演算子?
MyClass m(string s); MyClass *pm; *pm = m;
この場合、コンパイラが MyClass pm のテンプレート型を決定するのは困難です。
この問題を軽減するために、C 17 ではコンストラクター引数からの型推論が導入されました。 。これにより、テンプレート パラメーターをコンストラクター パラメーターから推論できるようになり、特定の状況で明示的な型引数が必要なくなります。例:
std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5); std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
この推論機能はまだ開発中であり、将来の C 標準では変更される可能性があることに注意することが重要です。それにもかかわらず、これはコードを簡素化し、型安全性を向上させるための重要な一歩を示しています。
以上が関数テンプレートのようなクラス コンストラクターに対して C テンプレート パラメーターを推論できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。