2016-05-11 38 views
7

In base a C++ Primer, l'operatore di freccia C++ fornisce un lvalue. Inoltre decltype di un'espressione che produce un lvalue genererà un tipo di riferimento. Quindi, perché il seguente decltype non produce non in un tipo di riferimento.Il tipo di freccia C++ restituisce lvalue

struct MyStruct { 
    string name 
}; 
MyStruct s; 
s.name = "aname"; 
MyStruct* p = &s; 
decltype (p -> name) str = s.name; //type of str will be string and not &string although p -> name yields an lvalue 
+3

Vedere http://en.cppreference.com/w/cpp/language/decltype. – Holt

risposta

5

Da decltype (che è da § 7.1.6.2/4 [dcl.type.simple]):

Se l'argomento è un unparenthesized id-espressione o un accesso membri classe unparenthesized, quindi decltype cede il tipo di entità denominata da questo ex pressione.

p->name cade nel caso precedente, in modo che il tipo di decltype(p->name) è il tipo di p->name che è std::string non std::string&.

D'altra parte, decltype((p->name)) è std::string& perché (p->name) è un'espressione lvalue.

9

Da cppreference

Se l'argomento è un unparenthesized id-espressione o un unparenthesized accesso membro della classe, quindi decltype cede il tipo di entità denominata con questa espressione. Se non esiste un'entità di questo tipo, o se l'argomento identifica un insieme di funzioni sovraccariche, il programma è mal formato.

Questo è il caso nel tuo esempio, quindi restituirà il tipo sottostante del membro, che è un std::string.

Se si desidera, è possibile aggiungere la parentesi in modo che decltype i risultati in un punto di riferimento:

//'str' is a std::string& 
decltype((p->name)) str = s.name;