2016-06-15 11 views
1

Es ist etwas über Universal references verwirrt mich wirklich, ich weiß, dassWie Universal-Referenzen abgeleitet bekommen

T&& + lvalue => T& 
T&& + rvalue => T&& 

Dann hörte ich Scott Meyers sagt: Es gibt „Sonderregel für den universellen Referenzen“, das ist:

T&& + rvalue => T (NOT T&&) 

Also habe ich einfach Test dachte, es Dinge

int i = 32; 
auto&& v = std::move(i); // assigning xvalue 

// According to Scott: auto&& is URef 
// And according to the "rule" v should get deduced to T 
// VS2015 tells me this is int&& (NOT int)... huh??? 

auto&& x = int(8); // assigning prvalue 
// same as above ... hmmm 

so klar wäre, was Ich bin hier fehlt ... ich wirklich verstehen müssen ...

Wenn URef bis zu T&& ableiten lassen und, wenn es um T ableiten lassen ... Ich würde Beispiele geschätzt klare Dinge zu helfen, bis ... Dank

Hinweis: Ich habe bereits SO gesucht Ich habe verwandte Fragen gefunden, aber keine spezifische Antwort auf diese Frage gefunden.

+4

Es gibt keine universellen Referenzen. Es war ein schrecklicher Ausdruck, und das richtige Wort ist "Forwarding Reference". – SergeyA

+0

Ich weiß, URef und RRef sind gleich – Laith

Antwort

6

Sie haben vergessen, wo Sie angefangen haben. Die ganze Idee war zu sehen, auf was auto sich bezieht. Es ergibt sich tatsächlich zu int. Und v ist vom Typ auto&&, dh int&&

3

Wenn T ein Template-Parameter (oder auto) und T&& verwendet wird T abzuleiten, dann:

  • Wenn das Argument ein R-Wert (xValue oder prvalue) vom Typ U, dann T wird einfach zu U und T&& ist U&& abgeleitet.
  • Wenn das Argument ein Lvalue vom Typ U ist, dann wird T zu U& und T&& ist U&& abgeleitet.

Ihre Verwirrung stammt wahrscheinlich von der Art der Template-Parameter verwirrend, T, mit der Art der Argumentation abgeleiteten Funktion, T&&.

Beachten Sie, dass, da T&& immer zu einem Referenztyp erweitert wird, eine Weiterleitungsreferenz tatsächlich eine Referenz ist und nie dazu führt, dass der Ausdruck als Wert übergeben wird.