Почему создание lvalue является одним из преимуществ возврата ссылки в C ++? - PullRequest
3 голосов
/ 12 сентября 2011

Я читаю текст C ++ по адресу: https://cs.senecac.on.ca/~chris.szalwinski/archives/oop244.071/content/custo_p.html. В разделе ВОЗВРАЩАЯСЯ ССЫЛКА автор писал:

» Возврат ссылки из функции имеет два внутренних преимущества :

  • эффективность

  • создает lvalue

"

Я могу понять первое преимущество (эффективность), но не понимаю, почему второе.

Как объяснил автор, я могу понять, что такое lvalue, но я не понимаю, какова связь между lvalue и возвратом ссылки из функции, так что lvalue становится выгодой?

1 Ответ

5 голосов
/ 12 сентября 2011

Это просто означает, что вы можете присвоить что-то результат функции.Рассмотрим этот пример:

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;
}
...