2016-06-18 3 views
3

Ok j'ai ce code:Pourquoi && lie-t-il parfois des lvalues ​​et d'autres moments non?

struct Mine{ 
    template<typename T> 
    Mine(T&& x){ 
    } 
}; 
void nFoo(int&& x){ 
} 
void sFoo(Mine x){ 
} 

Le nFoo prend un directement int&&, alors que le sFoo fait un peu finagling pour obtenir le même effet.

Tenir compte de ce code:

nFoo(12); //Works 

int x = 0; 
nFoo(x); //Cannot bind int (lvalue) to int&& 

sFoo(12); //Works 
sFoo(x); //Works 

Pourquoi le int&& permettent parfois de se lier lvalue s et parfois pas?

+2

Theres un bel article spécifiquement à ce sujet dans * Effective Modern C++ * par Scott Meyers. – Borgleader

+0

Copie possible de [Pourquoi "références universelles" ont la même syntaxe que les références rvalue?] (Http://stackoverflow.com/questions/20364297/why-universal-references-have-the-same-syntax-as-rvalue- références) – Borgleader

Répondre

9

Pourquoi le int & & permettent la liaison parfois de lvalues ​​et parfois pas?

int&& ne se lie pas à un lvalue parce qu'il est une référence rvalue.

T&&, dans un contexte où T est un argument de modèle, se lie à un lvalue car il s'agit d'un forwarding reference. Ce n'est pas une référence rvalue, même si la syntaxe est presque la même.

+0

est-il une source que vous pouvez consulter pour apprendre lvalue, rvalue, renvoi de référence, etc blow-by-blow? – snr

+0

[Exemple] (http://coliru.stacked-crooked.com/a/77bbf114e17ed0f4) –

+0

@snr J'imagine que les manuels modernes en C++ expliquent tout cela de manière structurée. Le seul livre C++ que je possède a été écrit en pré-C++ 11, donc je n'en connais aucun que je puisse recommander. Le document que j'ai maintenant lié dans la réponse devrait décrire assez bien les renvois et leur relation avec les autres références. – user2079303