Je viens de jouer avec g++ 4.7 (l'un des derniers instantanés) avec -std=c++11 activé. J'ai essayé de compiler une partie de mon code de base et un cas d'échec un peu me confond.
Je vous serais reconnaissant si quelqu'un peut expliquer ce qui se passe.
Voici le 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;
}
Je comprends que make_pair est censé être utilisé comme (1) cas (si j'ai spécifier les types, alors je pourrais aussi bien utiliser (3)), Mais je ne comprends pas pourquoi cela ne fonctionne pas dans ce cas.
L'erreur exacte est:
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>&&'
Encore une fois, la question ici est juste de "what's going on?" Je sais que je peux résoudre le problème en supprimant le modèle de cahier des charges, mais je veux juste savoir ce qui ne fonctionne pas ici sous les couvertures. Merci à l'avance.
EDIT:
- g++ 4.4 compile ce code avec pas de problèmes.
- Retrait -std=c++11 est également compile avec code avec pas de problèmes.