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

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

DDD
DDDOriginal
2024-12-16 16:58:17938Durchsuche

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

C 11 make_pair schlägt mit expliziten Vorlagenparametern fehl

Problem:

Bei Verwendung von g 4.7 Wenn -std=c 11 aktiviert ist, schlägt der folgende Code fehl kompilieren:

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

Trotz der Existenz der Funktion make_pair tritt beim Compiler ein Fehler auf.

Erklärung:

std::make_pair ist beabsichtigt ohne explizite Angabe von Vorlagenparametern verwendet werden. In C 11 werden zwei R-Wert-Referenzargumente benötigt, T&& und U&&, wobei T und U Vorlagentypparameter sind. Die explizite Angabe der Vorlagenargumente führt jedoch zu einer Diskrepanz zwischen den erwarteten R-Wert-Referenzen und dem bereitgestellten L-Wert-Argument (s im Beispielcode).

Folglich meldet der Compiler:

error: no matching function for call to ‘make_pair(std::string&, int)’

Wenn Vorlagenargumente nicht explizit bereitgestellt werden, erfolgt der Abzug von Vorlagenargumenten. Dadurch kann ein R-Wert-Referenzvorlagenparameter an einen L-Wert gebunden werden, wenn er als Funktionsargument erscheint. Im Fall von std::make_pair ohne Vorlagenargumente leitet der Compiler ab, dass T std::string& ist und U int ist, und bindet s und 7 erfolgreich an die Funktionsargumente.

Lösung:

Die empfohlene Verwendung von std::make_pair besteht darin, die Vorlagenargumente wegzulassen und sich auf die Ableitung der Vorlagenargumente zu verlassen. Durch Befolgen dieser Regel verarbeitet der Compiler die Argumentübereinstimmung korrekt und vermeidet Kompilierungsfehler.

Das obige ist der detaillierte Inhalt vonWarum schlägt „std::make_pair' mit expliziten Vorlagenparametern in C 11 fehl?. 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