2016-04-15 12 views
6

Ich habe ein Video über Art Abzugsregeln von Auto beobachtet und decltype von Scott Meyers ... Er erklärte die folgendenWas sind die Regeln für den Typabzug von decltype (rvalue expr)?

// decltype(lvalue expr) => reference to the type of the expression 
// decltype(lvalue name) => type of the name 

Ich verstehe diese Regeln erklärt ... aber er knapp über die folgenden

// decltype(rvlaue expr) => ??? 
erklären so

ich habe versucht, es zu verstehen, durch Üben, so habe ich die folgenden

int x = 8; 
int func(); // calling this function is rvlaue expr ... 

decltype(32) t1 = 128; // Ok t1 is int 
decltype(64) t2 = x;  // Ok t2 is int 
decltype(func()) t3 = x; // Ok t3 is int ... obviously 

nun die Magie

decltype(std::move(x)) t4 = x; // Error t4 is int&& ... compiler says 

ist nicht std :: move (x) ein rvalue Ausdruck? warum declltype deducing t4 zu int & & nicht nur int wie die obigen Beispiele? Was sind die Regeln von Deklinationsabdrücken für rvalue-Ausdrücke?

+1

Hinweis die Unterschrift von 'std :: move'.' Std :: remove_reference_t :: type && move (T &&); 'Es zurückgeben rvalue Referenz, nicht von Wert. – Jarod42

+0

Hätte nur eine Referenz konsultiert, dauert etwa zehn Sekunden, um die Dokumentation zu googeln. –

Antwort

2

decltype verhält sich nach der Art unterschiedlich basierend auf

verwendet wird, wenn der Wert der Kategorie des Ausdrucks xValue ist, ergibt dann decltype T & &;

Wenn die Wertkategorie des Ausdrucks lvalue ist, ergibt declltype T &;

, wenn der Wert der Kategorie des Ausdrucks prvalue ist, dann ergibt decltype T.

Wie Sie es zwei unterschiedliche Verhaltensweisen für rvalues ​​sehen können. Wenn der rvalue ein xvalue ist, erhalten wir T&& andernfalls ist es ein prvalue und wir erhalten T.

Wenn wir nun bei std::move suchen wir sehen, dass es eine xvalue kehrt als die Rückkehr T&& und nicht T. So std::move(x) ist ein xValue und richtig abgeleitet int&&