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.
fonte
2016-06-26 18:15:09
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. –