C ++箭头类型产生左值

时间:2016-05-11 15:41:44

标签: c++ decltype lvalue rvalue

根据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

2 个答案:

答案 0 :(得分:9)

来自cppreference

  

如果参数是未加密码的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->namestd::string而非std::string&

另一方面,decltype((p->name))std::string&,因为(p->name)是左值表达式。