Estoy usando la última compilación de GCC disponible del repositorio. Decidí usarlo porque algunas características adicionales de C++ 0x. Sin embargo ahora me quedé con algo que supone que funciona: quiero agregar un nuevo elemento al mapa a través del valor r. código simplificado, lo que demuestra problema:Las inserciones de valor R no funcionan para unordered_map
#include <tr1/unordered_map>
class X
{
public:
X (void) { /* ... */ };
X (const X& x) = delete;
X (X&& x) { /* ... */ };
};
int main (void)
{
std::tr1::unordered_map<int, X> map;
// using std::tr1::unordered_map<int, X>::value_type didn't help too
std::pair<int, X> value (1, X());
map.insert (std::move (value));
}
Aviso, que cuando reemplace X
clase con algún tipo simple como int
código se compila y funcionan igual de bien.
En mi código de producción, la clase correspondiente a X tampoco tiene constructor de copias.
El mensaje de error es (como todos los errores relacionados con la plantilla) largo e ilegible y no estoy seguro si es una buena idea ponerlo aquí. Notifícame si quieres un mensaje de error, así que actualizaré esta pregunta. Última parte del mensaje es interesante:
(...)
/usr/include/c++/trunk/ext/new_allocator.h:106:9: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’
In file included from /usr/include/c++/trunk/utility:71:0,
from /usr/include/c++/trunk/tr1/unordered_map:34,
from kod.cpp:1:
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: use of deleted function ‘X::X(const X&)’
Además, este debería funcionar, debido a fallo similar ya se fijó [C++0x] Implement emplace* in associative and unordered containers.
¿Tal vez estoy haciendo algo mal? Quiero estar seguro, ese es un error de GCC o libstdC++ antes de informarlo.
El método de "inserción" compatible con R-Value faltante ya está disponible en GCC 4.6.0 no publicado. – Goofy