C++箭头类型产生左值

C++ arrow type yields lvalue

本文关键字:类型 C++      更新时间:2023-10-16

根据C++引子,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

来自 cpp首选项

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

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

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

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

decltype 开始(来自 §7.1.6.2/4 [dcl.type.simple](:

如果参数是无括号的 id 表达式或无括号的类成员访问,则 decltype 将生成此表达式命名的实体的类型。

p->name属于上述情况,因此decltype(p->name)的类型是std::stringstd::string&p->name类型。

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