Это просто означает, что вы можете присвоить что-то результат функции.Рассмотрим этот пример:
int& foo() {
static int x;
return x;
}
void bar() {
foo() = 42;
}
Вместо int
, конечно, это работает и с объектами класса.Дело в том, что, возвращая ссылку на x
, вызывающий абонент может напрямую назначить переменную локальной области действия в foo
.Это то, что автор имеет в виду, говоря, что эталонное возвращаемое значение «создает lvalue».
Кстати, в примере действительно есть приложение, поскольку оно решает фиаско статического порядка инициализации для более сложных типов, чем int
.
Edit
Что касается "выгоды", существует несколько способов интерпретировать это.Либо это способ сделать ваш код более читабельным (в отличие от той же функциональности, реализованной с помощью указателей), либо использовать операции, которые можно применять только к lvalue, что было бы невозможно, если бы вы не возвращали ссылку /указатель, но получил аргумент:
struct X {
int a;
int b;
};
class Y_withoutRefs {
private:
X x;
public:
void setXa(int a) {
x.a = a;
}
int getXa() {
return x.a;
}
void setXb(int b) {
x.b = b;
}
int getXb() {
return x.b;
}
};
class Y_withRefs {
private:
X x;
public:
X& getX() {
return x;
}
};
void dosmth() {
Y_withoutRefs ywo;
Y_withRefs yw;
ywo.setXa(50+ywo.getXa());
yw.getX() += 50;
}