2016-05-11 3 views
7

Selon l'amorce C++, l'opérateur de flèche C++ donne une valeur lvalue. De plus, decltype d'une expression qui donne une valeur lvalue donnera un type de référence. Donc, pourquoi le type de declt suivant et non aboutit à un type de référence.Le type de flèche C++ donne 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

Voir http://fr.cppreference.com/w/cpp/language/decltype. – Holt

Répondre

5

De decltype (qui est de § 7.1.6.2/4 [dcl.type.simple]):

Si l'argument est un identifiant d'expression sans parenthèses ou un accès aux membres de la classe sans parenthèses, puis decltype donne le type de l'entité nommée par cet ex pression.

p->name tombe dans le cas ci-dessus, de sorte que le type de decltype(p->name) est le type de p->name qui est std::string pas std::string&.

D'autre part, decltype((p->name)) est std::string& car (p->name) est une expression lvalue.

9

De cppreference

Si l'argument est un identifiant d'expression sans parenthèses ou un accès aux membres de classe sans parenthèses, puis decltype donne le type de l'entité nommée par cette expression. En l'absence d'une telle entité, ou si l'argument nomme un ensemble de fonctions surchargées, le programme est mal formé.

Ceci est le cas dans votre exemple, il retournera donc le type sous-jacent du membre, qui est std::string.

Si vous voulez, vous pouvez ajouter des parenthèses afin que decltype résultats dans une référence:

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