ホームページ >バックエンド開発 >C++ >関数テンプレートのようなクラス コンストラクターに対して C テンプレート パラメーターを推論できないのはなぜですか?

関数テンプレートのようなクラス コンストラクターに対して C テンプレート パラメーターを推論できないのはなぜですか?

DDD
DDDオリジナル
2024-12-08 17:44:12200ブラウズ

Why Can't C   Template Parameters Be Inferred for Class Constructors Like Function Templates?

クラス コンストラクター テンプレート推論論争

テンプレート パラメーターは、次のコードのように関数の引数から簡単に推論できます。

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 サイトの他の関連記事を参照してください。

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