2016-05-11 1 views
7

Согласно C++ Primer, оператор со стрелкой C++ дает значение lvalue. Дополнительно decltype выражения, которое дает значение lval, приведет к эталонному типу. Итак, почему следующий тип decltype не приводит к ссылочному типу.Тип стрелки C++ дает значение 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

См. Http://en.cppreference.com/w/cpp/language/decltype. – Holt

ответ

5

От decltype (который из § 7.1.6.2/4 [dcl.type.simple]):

Если аргумент является Ид в скобках, выражение или доступ члена класса заключённого в скобках, то decltype дает тип объекта с именем этого экс прижимной.

p->name падает в приведенном выше случае, так что тип decltype(p->name) является типом p->name которого std::string не std::string&.

С другой стороны, decltype((p->name)) является std::string&, потому что (p->name) является выражением lvalue.

9

cppreference От

Если аргумент является заключённое в скобки Ид выражение или в скобки, доступ к члену класса, то decltype дает тип объекта, названного этим выражением. Если такой объект отсутствует или аргумент называет набор перегруженных функций, программа плохо сформирована.

Это пример вашего примера, поэтому он будет возвращать базовый тип элемента, который является std::string.

Если вы хотите, вы можете добавить скобки так, что decltype приводит к ссылке:

//'str' is a std::string& 
decltype((p->name)) str = s.name; 
Смежные вопросы