c++: функция lvalue или rvalue


Я только начал изучать ссылки rvalue в c++11, прочитав эту страницу, но я застрял на самой первой странице. Вот код, который я взял с этой страницы.

  int& foo();
  foo() = 42; // ok, foo() is an lvalue
  int* p1 = &foo(); // ok, foo() is an lvalue

  int foobar();
  j = foobar(); // ok, foobar() is an rvalue
  int* p2 = &foobar(); // error, cannot take the address of an rvalue
  1. Почему foo() является lvalue? это потому, что foo() возвращает int&, который в основном является lvalue?
  2. Почему foobar() является rvalue? это потому, что foobar() возвращает int?
  3. В общем, почему вас должно волновать, является ли функция rvalue или нет? Я думаю, что если я прочитаю остальную часть этой статьи, я получу мой ответ на это.
1 4

1 ответ:

L-значения являются местоположениями, R-значения являются фактическими значениями.

Итак:

  1. так как foo() возвращает ссылку (int&), это делает его lvalue себя.
  2. правильно. foobar() является rvalue, потому что foobar() возвращает int.
  3. нам все равно, является ли функция R-значением или нет. То, что нас волнует, - это ссылки на R-значение.
Статья, на которую вы указали, интересна, и я раньше не рассматривал пересылку или использование на фабриках. То причина, по которой я был взволнован ссылками на R-значение, заключалась в семантике перемещения, такой как:
BigClass my_function (const int& val, const OtherClass & valb);

BigClass x;
x = my_function(5, other_class_instance);

В этом примере x уничтожается, а затем возврат my_function копируется в x с помощью конструктора копирования. Чтобы обойти это исторически, вы бы написали:

void my_function (BigClass *ret, const int& val, const OtherClass & valb);

BigClass x;
my_function(&x, 5, other_class_instance);
Это означает, что теперь у my_function есть побочные эффекты, плюс это не так просто читать. Теперь, с помощью C++11, мы можем вместо этого написать:
BigClass & my_function (const int& val, const OtherClass & valb);

BigClass x;
x = my_function(5, other_class_instance);

И заставить его работать так же эффективно, как и во втором примере.