C++箭头类型产生左值

Nam*_*ami 7 c++ rvalue decltype lvalue

根据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
Run Code Online (Sandbox Code Playgroud)

Rak*_*111 9

来自cppreference

如果参数是未加密码的id-expression或未加括号的类成员访问,则decltype将生成此表达式命名的实体的类型.如果没有这样的实体,或者参数命名了一组重载函数,则程序格式不正确.

在您的示例中就是这种情况,因此它将返回成员的基础类型,即std::string.

如果需要,可以添加括号,以便decltype产生引用:

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


Hol*_*olt 5

From 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)是一个左值表达式.