根据C ++ Primer,C ++箭头运算符产生左值。另外,产生左值的表达式的 decltype
将导致引用类型。那么为什么以下的decltype 不会导致引用类型。
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
答案 0 :(得分:9)
如果参数是未加密码的id-expression或未加密码的类成员访问,则decltype将生成此表达式命名的实体的类型。如果没有此类实体,或者参数命名一组重载函数,程序格式不正确。
在您的示例中就是这种情况,因此它将返回成员的基础类型,即std::string
。
如果需要,可以添加括号,以便decltype
生成引用:
//'str' is a std::string&
decltype((p->name)) str = s.name;
答案 1 :(得分:5)
来自decltype
(来自§7.1.6.2/ 4 [dcl.type.simple] ):
如果参数是未加密码的id-expression或未加密集的类成员访问,则decltype将生成此表达式命名的实体的类型。
p->name
属于上述情况,因此decltype(p->name)
的类型为p->name
,std::string
而非std::string&
。
另一方面,decltype((p->name))
为std::string&
,因为(p->name)
是左值表达式。