2016-04-15 25 views
6

Ho guardato un video sulle regole di deduzione tipo di auto e decltype spiegato da Scott Meyers ... Egli ha spiegato il seguenteQuali sono le regole di deduzione del tipo di decltype (valore retto expr)?

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

capisco queste regole ... ma lui non spiegare il seguente

// decltype(rvlaue expr) => ??? 

così ho cercato di capirlo, praticando così ho fatto la seguente

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 

Ora la magia

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

non è std :: move (x) un'espressione di valore? perché decltype deducendo t4 in int & & non solo come gli esempi sopra? Quali sono le regole delle detrazioni di tipo decltype per le espressioni rvalue?

+1

nota la firma del 'std :: move':.' Std :: :: remove_reference_t tipo && mossa (T &&); 'E restituire un riferimento rvalue, non per valore. – Jarod42

+0

Potrebbe aver appena consultato un riferimento. Prende circa dieci secondi a Google la documentazione. –

risposta

2

decltype comporta diversamente basato sul tipo viene utilizzato su

se parte del valore di espressione è xValue, poi cede decltype T & &;

se la categoria di valore di espressione è lvalue, quindi decltype restituisce T &;

se la categoria del valore di espressione è prvalue, poi cede decltype T.

Come si può vedere che ha due comportamenti diversi per rvalues. Se il valore di rvalue è un valore x, otteniamo T&& altrimenti è un valore di prvalore e otteniamo T.

Ora se guardiamo a std::move vediamo che restituisce un xvalue come il ritorno è T&& e non T. Così std::move(x) è un xValue ed è correttamente dedotto a int&&