表达式 class{}.refmem 成为左值表达式的基本原理是什么

问题描述 投票:0回答:1

我开始知道

S{}.rval
是一个左值表达式。我想知道将其视为左值表达式背后的基本原理。

为什么要访问引用类型左值的非静态成员,即使该对象是右值?

struct S {
    int val;
    int& rval = val;
};
int main() {
    S{}.val; // xvalue
    S{}.rval; // lvalue
}

我的期望是,提到“即将消亡的实体”也将是“即将消亡”。 所以我想了解规则的基本原理。

c++ reference value-categories
1个回答
1
投票

我的期望是,提及“即将消亡的实体”也将是“即将消亡”。

事实并非总是如此。引用成员 可能会为一个比临时对象

S{}
更长寿的对象起别名。

例如:

int i = 10;
struct S {
   
    int& rval = i; // rval refers to the global i
};
int main() {
    S{}.rval;     //the aliased object will outlive the object expression `S{}`
}
© www.soinside.com 2019 - 2024. All rights reserved.