2016-06-26 16 views
14

In base a questo answer, ref dovrebbe essere un int.Perché decltype (a, b) viene valutato come riferimento?

Ma per qualche ragione ha valutato a int&, sia in gcc e MSVC2015, mentre decltype(b) sia correttamente valutata ad appena int. Perchè così?

int a = 1, b = 2; 
decltype(a, b) ref; // ref is int& 
decltype(b) var; // var is int 
+1

Forse 'decltype (espressione)' fa una conversione lvalue-rvalue (non ODR-usato) della sua espressione, ma, ancora una volta, forse, la seconda espressione, 'B' non fa a causa dell'operatore virgola, quindi, 'b' rimane come un valore, essendo il suo tipo corrispondente un riferimento. –

risposta

17

a, b è un'espressione. Secondo decltype regole per le espressioni, se il risultato dell'espressione è un lvalue, tipo sta per essere dedotta come T&

7.1.6.2/4 tipo semplice prescrittori [dcl.type.simple]
Per un'espressione e, del tipo indicato con decltype (e) è definito come segue:

  • se e è un unparenthesized id-espressione o un unparenthesized member classe (5.2.5), decltype (e) è il tipo dell'ente nominato da e. Se non esiste un'entità di questo tipo, o se si denomina una serie di funzioni sovraccaricate, il programma è mal formato;
  • altrimenti, se e è un xvalue, decltype (e) è T & &, dove T è il tipo di e;
  • altrimenti, se e è un lvalue, decltype (e) è T &, dove T è il tipo di e;
  • altrimenti, decltype (e) è il tipo di e.

La parte confusa circa differenza tra "tipo del soggetto nominato da e" e "tipo di e" è facile da capire con l'esempio:

Se qualche entità e è dichiarata come int& e = x;, quindi in seguito, nell'espressione e, tipo di e è int e tipo dell'entità denominata da e è int&. In breve, il tipo di e elimina i qualificatori di riferimento.

+1

'a' è un lvalue, tuttavia,' decltype (a) 'è dedotto come solo' int', non 'int &'. –

+2

@ Peregring-lk Esiste una regola specifica per il nome dell'entità. Preventivo standard in un secondo. –

+0

Puoi produrre una citazione che "il tipo di' e', dove 'int & e = x;', è 'int'"? – Yakk

8

Per lo stesso motivo per cui sarebbe decltype((a)) ref dichiarare ref come riferimento (int &, anziché int).

decltype le regole sono diverse quando si tratta di espressioni piuttosto che di entità. La categoria di valore dell'espressione a, b è un lvalue, quindi decltype(a, b) produce T& ->int &.

Vedi anche http://en.cppreference.com/w/cpp/language/decltype

Problemi correlati