Heim >Backend-Entwicklung >C++ >Warum können C-Vorlagenparameter nicht für Klassenkonstruktoren wie Funktionsvorlagen abgeleitet werden?

Warum können C-Vorlagenparameter nicht für Klassenkonstruktoren wie Funktionsvorlagen abgeleitet werden?

DDD
DDDOriginal
2024-12-08 17:44:12204Durchsuche

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

Kontroverse um Klassenkonstruktor-Vorlageninferenzen

Vorlagenparameter können bequem aus Funktionsargumenten abgeleitet werden, wie im folgenden Code:

template <typename T>
void swap(T& a, T& b) {
  T temp = a;
  a = b;
  b = temp;
}

Ein ähnlicher Ansatz ist jedoch für Klassenkonstruktoren nicht zulässig, was bei C-Programmierern Fragen aufgeworfen hat. Warum nicht?

Der Grund für diese Inkonsistenz liegt in der Komplexität der Objektkonstruktion. Konstruktoren sind nicht der einzige Einstiegspunkt für eine Klasse. Kopierkonstruktoren und Zuweisungsoperatoren spielen ebenfalls eine wichtige Rolle, und das Ableiten von Vorlagenparametern nur vom Konstruktor könnte zu Mehrdeutigkeiten führen.

Betrachten Sie das folgende Beispiel:

template <typename T>
class Variable {
  T data;
public:
  Variable(T d) { data = d; }
};

Wenn die Vorlageninferenz zulässig wäre, würde die Folgender Code wäre gültig:

Variable var(2); // Equivalent to Variable<int> var(2);

Aber was wäre, wenn wir die Kopierkonstruktion oder Zuweisung verwenden würden Operatoren?

MyClass m(string s);
MyClass *pm;
*pm = m;

In diesem Fall wäre es für den Compiler schwierig, den Vorlagentyp von MyClass pm zu bestimmen.

Um dieses Problem zu beheben, führte C 17 die Typableitung aus Konstruktorargumenten ein . Dadurch können Vorlagenparameter aus Konstruktorparametern abgeleitet werden, sodass in bestimmten Situationen keine expliziten Typargumente erforderlich sind. Zum Beispiel:

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);

Es ist wichtig zu beachten, dass sich diese Inferenzfunktion noch in der Entwicklung befindet und möglicherweise Änderungen in zukünftigen C-Standards unterliegt. Dennoch stellt es einen bedeutenden Schritt zur Vereinfachung des Codes und zur Verbesserung der Typensicherheit dar.

Das obige ist der detaillierte Inhalt vonWarum können C-Vorlagenparameter nicht für Klassenkonstruktoren wie Funktionsvorlagen abgeleitet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn