Ich habe gerade mit g ++ 4.7 (einem der späteren Schnappschüsse) mit aktiviertem -std = c ++ 11 herumgespielt. Ich habe versucht, einen Teil meiner vorhandenen Codebasis zu kompilieren, und ein fehlgeschlagener Fall verwirrt mich etwas.
Ich würde mich freuen, wenn jemand erklären kann, was los ist.
Hier ist der Code:
#include <utility>
#include <iostream>
#include <vector>
#include <string>
int main ( )
{
std::string s = "abc";
// 1 ok
std::pair < std::string, int > a = std::make_pair ( s, 7 );
// 2 error on the next line
std::pair < std::string, int > b = std::make_pair < std::string, int > ( s, 7 );
// 3 ok
std::pair < std::string, int > d = std::pair < std::string, int > ( s, 7 );
return 0;
}
Ich verstehe , dass make_pair ist gemeint als (1) Fall verwendet werden (wenn ich die Typen angeben, dann könnte ich auch verwenden (3)), aber ich verstehe nicht, warum es in diesem Fall versagt.
Der genaue Fehler ist:
test.cpp: In function ‘int main()’:
test.cpp:11:83: error: no matching function for call to ‘make_pair(std::string&, int)’
test.cpp:11:83: note: candidate is:
In file included from /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/utility:72:0,
from test.cpp:1:
/gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5:
note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_T1>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5:
note: template argument deduction/substitution failed:
test.cpp:11:83: note: cannot convert ‘s’ (type ‘std::string {aka std::basic_string<char>}’) to type ‘std::basic_string<char>&&’
Auch hier lautet die Frage nur: "Was ist los?" Ich weiß, dass ich das Problem beheben kann, indem ich die Vorlagenspezifikation entferne, aber ich möchte nur wissen, was hier unter der Decke fehlschlägt.
- g ++ 4.4 kompiliert diesen Code ohne Probleme.
- Das Entfernen von -std = c ++ 11 wird auch problemlos mit Code kompiliert.
std::vector
Konstruktion . Zumindest dieser ergibt einen Compilerfehler und keine stille Änderung der Semantik.