recientemente he instalado Visual Studio 2010 Professional RC para probar y probar las pocas características de C++ 0x que se implementan en VC++ 2010.problema con los "tipos movibles sólo" en VC++ 2010
I instanciado un std::vector
de std::unique_ptr
, sin ningún problema. Sin embargo, cuando trato de poblarlo pasando temporarios a push_back
, el compilador se queja de que el constructor de copia de unique_ptr
es privado. Intenté insertar un lvalue moviéndolo, y funciona muy bien.
#include <utility>
#include <vector>
int main()
{
typedef std::unique_ptr<int> int_ptr;
int_ptr pi(new int(1));
std::vector<int_ptr> vec;
vec.push_back(std::move(pi)); // OK
vec.push_back(int_ptr(new int(2))); // compiler error
}
Como resultado, el problema no es ni unique_ptr
ni vector::push_back
pero la forma en VC++ resuelve sobrecargas cuando se trata de rvalues, como lo demuestra el siguiente código:
struct MoveOnly
{
MoveOnly() {}
MoveOnly(MoveOnly && other) {}
private:
MoveOnly(const MoveOnly & other);
};
void acceptRValue(MoveOnly && mo) {}
int main()
{
acceptRValue(MoveOnly()); // Compiler error
}
El compilador se queja de que la copia constructor no es accesible. Si lo hago público, el programa compila (aunque el constructor de copia no está definido).
¿Entendí mal algo sobre las referencias de rvalue, o es un error (posiblemente conocido) en la implementación de esta característica en VC++ 2010?
¡Gracias por la confirmación! –