2011-08-23 16 views
7

He estado jugando con referencias Rvalue últimamente y he estado experimentando un problema extraño. Vamos a definir una clase simple denominada Foo que contiene una vector<int>:Uso de referencia Rvalue dentro de listas de inicialización

class Foo 
{ 
public: 

    Foo(std::vector<int>&& v) 
     : v_(v) 
    {} 

private: 

    std::vector<int> v_; 
}; 

Un Foo ejemplo, puede construirse haciendo pasar una vector<int> temporal como esto:

std::vector<int> temp; 
Foo(std::move(temp)); 

Ahora, cuando trataba de pasar a través de este código , Noté que el vector dentro de Foo se construye usando el constructor de copias en lugar del constructor de movimientos. Sin embargo, si yo indique el constructor de la manera siguiente:

Foo(std::vector<int>&& v) 
    : v_(std::move(v)) 
{} 

Entonces, el movimiento constructor del miembro v_ se llama apropiadamente. ¿Por qué es así? ¿Por qué es necesario el número std::move(v) redundante en la lista de inicialización? ¿Por qué el compilador no puede deducir la intención de llamar al vector move-constructor ya que el argumento constructor Foo correspondiente se especifica como una referencia Rvalue?

Por cierto, estoy usando GCC 4.6 con la opción -std = C++ 0x.

Gracias por su ayuda. PMJ

Respuesta

7

Dentro de la función (o constructor) un parámetro con nombre es un lvalue, incluso si se declara como una referencia rvalue.

La razón es algo así como

void foo(std::vector<int>&& v) 
{ 
    bar(v); 
    baz(v); 
    boo(v); 
    buz(v); 
} 

En cuál de estas llamadas al compilador debe considerar el traslado del objeto v?

Ninguno de ellos, a menos que lo haga explícitamente.

+0

Para que pueda obtener el mismo efecto (aunque con 1 llamada de constructor de movimiento más) simplemente tomando el objeto por valor. La persona que llama usa 'std :: move', y el constructor usa' std :: move'. 2 constructores, pero no asignaciones. –

+0

@Bo Persson: Gracias la respuesta clara. No había pensado en el problema que surgió al hacer referencia al argumento de Rvalue varias veces. @ Nicol Bolas: No estoy seguro de entender su punto, ¿podría dar algún ejemplo, por favor? Gracias. – pmjobin

Cuestiones relacionadas