Heim > Backend-Entwicklung > C++ > Warum schlägt „std::make_pair' mit expliziten Vorlagenargumenten in C 11 fehl?

Warum schlägt „std::make_pair' mit expliziten Vorlagenargumenten in C 11 fehl?

Mary-Kate Olsen
Freigeben: 2025-01-05 02:03:40
Original
484 Leute haben es durchsucht

Why Does `std::make_pair` Fail with Explicit Template Arguments in C  11?

Das Rätsel lösen: std::make_pair-Rätsel mit expliziten Vorlagenparametern

Im Bereich C hat die Funktion std::make_pair als praktische Funktion an Bedeutung gewonnen Werkzeug zum Erstellen von Paaren. Beim Versuch, diese Funktion mit explizit angegebenen Vorlagenparametern in C 11 zu verwenden, tritt jedoch ein besonderes Problem auf. Dieser Artikel befasst sich mit dem rätselhaften Verhalten hinter dieser Situation.

Fehler vorliegen

Bedenken Sie Folgendes Codeausschnitt, der versucht, ein Paar aus einer Zeichenfolge und einer Ganzzahl mit expliziten Vorlagenargumenten zu erstellen:

std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
Nach dem Login kopieren

Anstelle des erwarteten Wenn die Kompilierung erfolgreich war, erscheint eine kryptische Fehlermeldung:

error: no matching function for call to 'make_pair(std::string&, int)'
Nach dem Login kopieren

Unveiling the Mystery

Die Ursache dieses Fehlers liegt in der falschen Verwendung von std::make_pair. Die Funktion wurde entwickelt, um die Vorlagenparameter basierend auf den bereitgestellten Argumenten abzuleiten. Die explizite Angabe dieser Parameter behindert diesen Inferenzprozess.

Unter der Haube

Die C 11-Implementierung von std::make_pair benötigt zwei Parameter vom Typ T&& und U&&, wobei T und U Vorlagentypparameter sind . Wenn die Vorlagenargumente explizit angegeben werden, wie im problematischen Code zu sehen ist, erfolgt kein Argumentabzug. Stattdessen werden die angegebenen Typen direkt in die Vorlagendeklaration eingesetzt, was zu Folgendem führt:

make_pair(std::string&& argT, int&& argU);
Nach dem Login kopieren

Die entscheidende Rolle von R-Wert-Referenzen

Beachten Sie, dass beide Parameter in der explizit angegebenen Vorlage R-Werte sind Referenzen (&&), die nur an R-Wert-Ausdrücke gebunden werden können. Im bereitgestellten Code ist s ein L-Wert (kein temporärer Wert und wird nicht verschoben). Folglich stimmt die Funktionsvorlage nicht mit den Argumenten überein, was zu einem Kompilierungsfehler führt.

Warum es ohne explizite Argumente funktioniert

Wenn die expliziten Vorlagenargumente weggelassen werden, erfolgt ein Argumentabzug. Aufgrund der besonderen Natur von R-Wert-Referenzparametern in Vorlagen (Referenzkollabierung) kann ein R-Wert-Referenzparameter vom Typ A&&, wobei A ein Vorlagentypparameter ist, an jeden Typ von A gebunden werden. Unabhängig davon, ob A ein L-Wert, ein R-Wert, ein qualifizierter oder ein R-Wert ist Nein, ein A&& kann daran binden.

Im Beispielcode ist s ein L-Wert vom Typ std::string und 7 ein R-Wert vom Typ int. Der Compiler leitet daraus ab, dass T std::string& und U int ist, sodass s und 7 erfolgreich an die abgeleiteten Parametertypen gebunden werden können.

Schlussfolgerung

Um solche Fehler zu vermeiden, halten Sie sich an die Folgender Grundsatz gilt: Wenn ein Vorlagenargument aus den Funktionsargumenten abgeleitet werden kann, erlauben Sie dem Compiler, die Schlussfolgerung durchzuführen. Die explizite Angabe von Argumenten ist oft unnötig und kann zu unerwarteten Ergebnissen führen. Durch die Nutzung der Kraft der Argumentableitung können Programmierer ihren Code vereinfachen und seine Lesbarkeit verbessern, während er gleichzeitig seine Korrektheit beibehält.

Das obige ist der detaillierte Inhalt vonWarum schlägt „std::make_pair' mit expliziten Vorlagenargumenten in C 11 fehl?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage