2010-04-21 16 views
10

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?

Respuesta

12

Desafortunadamente,/Za tiene problemas. Realiza una comprobación de accesibilidad de constructor de copia elided cuando no debería (las referencias de rvalue vinculante no invocan constructores de copia, incluso teóricamente). Como resultado,/Za no debería ser usado.

Stephan T. Lavavej, Visual C++ bibliotecas desarrollador ([email protected])

+0

¡Gracias por la confirmación! –

1

En primer lugar, se necesita una estrecha ):

vec.push_back(int_ptr(new int(2))); // error del compilador

Ahora no tengo ningún error del compilador ni el primero ni el segundo caso.

Uso Visual Studio 2010 Beta.

+0

Lo siento, debe haber borrado accidentalmente el paréntesis al escribir mi pregunta. Gracias por probar esto en la Beta, fortalece mi sensación de que esto es un error en el RC ... –

+0

Me funciona bien en VS2010 RC. – Sumant

+0

Hum, esto se vuelve cada vez más extraño. ¿Podría proporcionar la versión exacta de Visual C++ 2010 que ha instalado? –

1

Me di cuenta de que había desactivado las extensiones de idioma (\ Za). Con las extensiones habilitadas, el código se compila correctamente. Todavía creo que esto es un error, ya que el código presentado aquí es perfectamente estándar (hasta donde yo sé) y no depende de ninguna extensión de Microsoft.

Cuestiones relacionadas