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
Freigeben: 2024-12-08 17:44:12
Original
201 Leute haben es durchsucht

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;
}
Nach dem Login kopieren

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; }
};
Nach dem Login kopieren

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);
Nach dem Login kopieren

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

MyClass m(string s);
MyClass *pm;
*pm = m;
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage