2015-12-27 15 views
11

Pensando a valori (x | R | l | | pr GL), la seguente questione mi sono venute in mente:variabili dichiarate da &&

Considerate le seguenti due dichiarazioni di variabili:

X x = ...; 

e

X&& x = ...; 

e assumere il ... fanno non consegnare un xValue.

Qualcuno può pensare al codice non utilizzando decltype in cui questo fa la differenza? In entrambi i casi, (x) sarà di un valore di tipo X, non è vero?

+1

intendo la differenza nella utilizzando le variabili così dichiarate. – JohnB

risposta

4

Template non-argomenti di tipo cannot refer to a temporary. Pertanto, data

struct X {}; 
X purr() { return {}; } 

X x1 = purr(); 
X&& x2 = purr(); 

template<X&> class woof {}; 

abbiamo

woof<x1> w1; // OK 
woof<x2> w2; // Error 

Se ... non è limitato a un tipo di prvalue X, quindi affettare è un modo meno oscuro per rendere i due non equivalenti. Dato:

struct X { virtual ~X() = default; }; 
struct Y : X {}; 

Y meow() { return {}; } 

Poi:

X x1 = meow();  // slices 
X&& x2 = meow();  // doesn't slice 

Così:

dynamic_cast<Y&>(x1); // throws std::bad_cast 
dynamic_cast<Y&>(x2); // OK 
+0

Questo è molto bello. Grazie. – JohnB

6

esempio Forse artificiale, ma con

struct X 
{ 
    X() = default; 
    X(const X&) = delete; 
    X operator =(const X&) = delete; 
    X(X&&) = delete; 
    X operator =(X&&) = delete; 
}; 

X makeX() {return {};} 

seguente compila

X&& x = makeX(); 

considerando che in seguito non

X x = makeX(); 
+0

Anche il riferimento 'const' funzionerebbe, se non ti importa la costanza. –

+0

Grazie per la risposta e i commenti. Non ne ero consapevole, quindi ho imparato qualcosa. La mia domanda, tuttavia, mirava di più al codice usando la variabile. – JohnB

+1

Commento: È un po 'strano. Il && sembra suggerire che 'x' è qualcosa da cui dovresti muoverti, eppure il tuo esempio funziona per il semplice fatto che tu * non puoi * spostare' X's. – JohnB

Problemi correlati