2011-01-26 15 views
7

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.

+0

El método de "inserción" compatible con R-Value faltante ya está disponible en GCC 4.6.0 no publicado. – Goofy

Respuesta

5

Tu código me parece correcto, excepto por el uso de tr1. El material calificado para tr1 no sabe acerca de la semántica de referencia rvalue o move.

Tomé su código, eliminé tr1 del encabezado y los calificadores del espacio de nombres, y compilé su código exitosamente usando g ++ - 4.4 y libC++ (http://libcxx.llvm.org/). Intenta eliminar tr1.

+0

Funciona, raro hace algún tiempo el compilador me obligó a usar el espacio de nombres "tr1" cuando estaba tratando de usar algunas de las características de TR1 ... – Goofy

+2

tr1 se refiere a un informe técnico no normativo. Eso significa que cualquier característica en él se considera opcional; el estándar no lo requiere. tr1 contenía muchos de los componentes de la biblioteca que posteriormente se movieron a C++ 0x. Algunas veces, durante ese movimiento de std :: tr1 a std ::, los componentes fueron modificados. Agregar semántica de movimiento a unordered_map es un ejemplo de dicha modificación. tr1 es anterior a C++ 0x. Es posible que haya estado usando una versión que tenía tr1, pero que no tenía características de C++ 0x. –

+0

(tardía) bienvenida en SO :) –

0

El value_type de ese unordered_map no es std::pair<int, X>. Es std::pair<const int, X>. Tal vez si usa ese tipo para el value, funcionará mejor.

decltype(map)::value_type value(1, X()); 
map.insert(std::move(value)); 

Aunque no entiendo exactamente por qué su código no debería funcionar como está.

Cuestiones relacionadas