2012-02-03 10 views
5

consideran este código:rvalue-reference to array: ¿puede suceder realmente?

#include <iostream> 
using namespace std; 

typedef int array[12]; 

array sample; 

array ret1(){ //won't compile 
    return sample; 
} 

array& ret2(){ 
    return sample; 
} 

array&& ret3(){ 
    return sample; //won't compile 
} 

void eat(array&& v){ 
    cout<<"got it!"<<endl; 
} 

int main(){ 
    eat(ret1()); 
    eat(ret2()); //won't compile 
    eat(ret3()); //compiles, but I don't really know how to write a function that returns a rvalue-reference to an array 
} 

La única versión que en realidad parece que compilar es ret3(). De hecho, si omito la implementación y solo la declaro, se compila (y nunca se vincula, por supuesto), pero realmente no sé cómo devolver explícitamente una referencia rvalue a una matriz. Si esto no puede suceder, ¿puedo concluir que la referencia rvalue a las matrices no está prohibida, pero simplemente no se puede usar?

EDIT:

me he dado cuenta de que esto funciona:

array&& ret3(){ 
    return std::move(sample); 
} 

ahora la diversión es la comprensión de lo que es realmente vale la pena ...

+0

posible duplicado de [Array y Rvalue] (http://stackoverflow.com/questions/3656726/array-and-rvalue) –

+0

En realidad, de alguna manera pasé por alto la "referencia" en la pregunta. Esto no es un duplicado en absoluto. –

+0

Un puntero rvalue contra un puntero lvalue: decae de cualquier manera, entonces, ¿cuál es el beneficio percibido aquí? – ildjarn

Respuesta

3

Bueno, ahora están tratando a su matriz como un valor r Puedes pensarlo como un objeto temporal. Puede usar esta información y tener en cuenta que es seguro modificar sus contenidos. Por ejemplo, puede escribir la función print_sorted(array&) que imprimirá el contenido ordenado de una matriz determinada. Para hacer esto, puede ordenarlo en un búfer adicional, ya que no desea mezclar datos dados. Pero la misma función con el prototipo print_sorted(array&&) puede ordenar la matriz in situ, ya que sabe que el objeto es temporal.

Sin embargo, las referencias r-value a objetos simples sin datos dinámicos almacenados no parecen muy útiles.

Cuestiones relacionadas