Solo estaba jugando con g ++ 4.7 (una de las instantáneas posteriores) con -std = c ++ 11 habilitado. Traté de compilar algo de mi base de código existente y un caso que falló me confunde un poco.
Agradecería que alguien me pudiera explicar lo que está pasando.
Aquí está el código:
#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;
}
Entiendo que make_pair está destinado a usarse como el caso (1) (si especifico los tipos, entonces también podría usar (3)), pero no entiendo por qué está fallando en este caso.
El error exacto es:
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>&&’
Una vez más, la pregunta aquí es simplemente "¿qué está pasando?" Sé que puedo solucionar el problema eliminando la especificación de la plantilla, pero solo quiero saber qué está fallando aquí debajo de las cubiertas.
- g ++ 4.4 compila este código sin problemas.
- La eliminación de -std = c ++ 11 también se compila con código sin problemas.
std::vector
construcción . Al menos este produce un error de compilación y no un cambio silencioso en la semántica.