Я узнал, что S{}.rval
— это выражение lvalue. Я хочу знать причину, по которой это выражение является lvalue.
Почему осуществляется доступ к нестатическому члену ссылочного типа lvalue, даже если объект является rvalue?
struct S {
int val;
int& rval = val;
};
int main() {
S{}.val; // xvalue
S{}.rval; // lvalue
}
Я ожидал, что ссылка на «сущность, которая скоро умрет», будет также означать «скоро умрет». Поэтому я хотел бы понять обоснование правил(ов).
Измените int& rval = val;
на int& rval = some_global;
. Тип изменился?
По той же причине вызов функции, возвращающей ссылку lvlaue, является выражением lvlaue. Как и в int i = 0; int& f(){return i;}
, вызов f();
— это выражение lvalue.
«Я хочу знать причину считать это выражением lvalue» — почему бы и нет? У него есть имя, и ему можно присвоить значение. Следовательно, это lvalue. Независимо от срока его службы.
@RemyLebeau Я думаю, что это обратный путь: ему можно присвоить значение, потому что это lvalue (встроенные операторы присваивания ожидают, что левый операнд является lvalue). С уважением
Компилятор не может знать, скоро ли
rval
умрет.