如何解决表达式“ E1.E2”表示实体是什么类型,何时E2属于引用类型
struct Test{
Test(int& v):rf(v){}
int& rf;
int obj;
};
int main(){
int i = 0;
Test t{i};
t.rf = 1;
t.obj = 1;
}
根据class member access的这些规则:
如果声明E2具有“对T的引用”类型,则则E1.E2是一个左值; E1.E2的类型为T 。否则,将应用以下规则之一。
该子句仅说明value category
是引用类型时E2
和表达式的类型。这与适用于表达式E1.E2
的这些子句不同,其中E2
不是引用类型。讨论了由该表达式隐式表示的实体。如:
如果E2是静态数据成员,并且E2的类型是T,则E1.E2是一个左值; 表达式指定类的命名成员。
如果E2是非静态数据成员,并且E1的类型为“ cq1 vq1 X”,而E2的类型为“ cq2 vq2 T”,则该表达式指定由表示的对象的命名成员第一个表达式。
如果它引用一个静态成员函数,并且E2的类型是“返回T的参数类型列表的函数”,则E1.E2是一个左值; 表达式指定静态成员函数。
否则,如果E1.E2引用了一个非静态成员函数,而E2的类型是“ parameter-type-list cv ref-qualifier opt 的函数 返回T”,则E1.E2是prvalue。 表达式指定一个非静态成员函数。
[expr.ref]节说明了E1.E2
所表示的实体的所有情况,除了E2
是引用类型时。
glvalue的结果是由表达式表示的实体。
例如t.obj
,因为obj
是非静态非参考数据成员(以下规则之一适用,该表达式指定由对象指定的对象的命名成员)第一个表达式),因此由表达式t.obj
表示的实体是对象obj
的成员t
,即{{1}中的子对象obj
},所以这样的左值就是这样的实体。
但是,对于示例t
,[expr.ref]中没有任何引号指出该表达式表示的实体是什么?当将赋值操作应用于这样的左值t.rf
,t.rf = 1;
作为glvalue时,应确定它表示哪个实体,然后右操作数将修改该实体的值。所以,我的问题是:
表达式t.rf
表示的实体是什么,标准中的哪个规则说明了这一点?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。