2015-12-27 2 views
11

Réflexion sur les valeurs (x | r | l | | pr gl), la question suivante est venu à mon esprit:Les variables déclarées par &&

Considérons les deux déclarations de variables suivantes:

X x = ...; 

et

X&& x = ...; 

et supposons que le ... faire pas livrer un xvalue.

Quelqu'un peut-il penser au code pas en utilisant decltype dans lequel cela fait une différence? Dans les deux cas, (x) sera par une valeur de type X, n'est-ce pas?

+1

Je veux dire la différence en utilisant les variables ainsi déclarées. – JohnB

Répondre

4

Modèle arguments non de type cannot refer to a temporary. Ainsi, étant donné

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

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

template<X&> class woof {}; 

nous avons

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

Si ... ne se limite pas à un prvalue de type X, puis trancher est une manière moins obscure pour que les deux non équivalentes. Étant donné:

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

Y meow() { return {}; } 

Puis:

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

Ainsi:

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

C'est très bien. Je vous remercie. – JohnB

6

Peut-être par exemple artificiel, mais avec

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

X makeX() {return {};} 

suivant compile

X&& x = makeX(); 

alors ne explique pas

X x = makeX(); 
+0

référence 'const' fonctionnerait aussi, si cela ne vous dérange pas constness. –

+0

Merci pour la réponse et les commentaires. Je n'étais pas au courant de cela, alors j'ai appris quelque chose. Ma question, cependant, ciblait plus le code utilisant la variable. – JohnB

+1

Commentaire: C'est un peu bizarre. Le && semble suggérer que 'x' est quelque chose dont vous devriez partir, mais votre exemple fonctionne par le simple fait que vous * ne pouvez pas * déplacer' X's. – JohnB