Estaba jugando con g ++ 4.7 (una de las instantáneas posteriores) con -std = C++ 11 activado. Traté de compilar parte de mi código base existente y un caso que falló algo me confunde.C++ 11 make_pair con parámetros de plantilla especificados no compila
Agradecería que alguien pudiera explicarme lo que está sucediendo.
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 es significaba para ser utilizado como la (1) caso (si puedo especificar los tipos, entonces yo también podría utilizar (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 constexpr std::pair::__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}’) to type ‘std::basic_string&&’
Una vez más, la cuestión 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í bajo las sábanas. Gracias por adelantado.
EDIT:
- g ++ 4.4 compila el código sin problemas.
- Removing -std = C++ 11 también compila con código sin problemas.
Una pregunta excelente. Otro ejemplo de un cambio de ruptura sutil en C++ 11, similar a [el cambio de última hora en la construcción de 'std :: vector'] (http://stackoverflow.com/questions/5759232/stdvector-default-construction-c11- and-breaking-changes). Al menos, esto produce un error de compilación y no un cambio silencioso en la semántica. –
Si tengo una variable entera i. Quiero hacer pareja con i y otro objeto. ¿Cómo debería llamar makepair exactamente? 1) make_pair <*i, obj> 2) int && j = i; make_pair? Ambos no están funcionando. ¿Cuál es la forma correcta de hacerlo? –
PHcoDer