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.
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);
Anstelle des erwarteten Wenn die Kompilierung erfolgreich war, erscheint eine kryptische Fehlermeldung:
error: no matching function for call to 'make_pair(std::string&, int)'
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.
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);
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.
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.
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!