2012-02-03 20 views
5

Considerate questo codice:rvalue-reference to array: può effettivamente accadere?

#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 
} 

L'unica versione che sembra in realtà per la compilazione è ret3(). Infatti, se tralascio l'implementazione e la dichiaro, compila (e non collega mai, ovviamente), ma in realtà non so come restituire esplicitamente un riferimento di valore a un array. Se questo non può accadere, allora posso concludere che il riferimento al valore di riferimento agli array non è proibito ma non può essere usato?

EDIT:

Ho appena realizzato che questo funziona:

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

ora il divertimento è capire che cosa è in realtà vale la pena ...

+0

possibile duplicato di [Array e Rvalue] (http://stackoverflow.com/questions/3656726/array-and-rvalue) –

+0

In realtà, in qualche modo ho sorvolato il "riferimento" nella domanda. Questo non è affatto un duplicato. –

+0

Un puntatore rvalore rispetto a un puntatore lvalue - decadono in entrambi i modi, quindi qual è il vantaggio percepito qui? – ildjarn

risposta

3

Beh, si stanno ora trattando l'array come un r-value. Puoi pensarlo come un oggetto temporaneo. È possibile utilizzare queste informazioni e tenere presente che è sicuro modificarne i contenuti. Ad esempio, è possibile scrivere la funzione print_sorted(array&) che stamperà i contenuti ordinati di un determinato array. Per fare ciò, puoi ordinarlo in un buffer aggiuntivo, dato che non vuoi mescolare dati dati. Ma la stessa funzione con il prototipo print_sorted(array&&) può ordinare l'array sul posto, poiché sa che l'oggetto è temporaneo.

Tuttavia, i riferimenti di valore r agli oggetti semplici senza dati dinamici memorizzati non sembrano molto utili.