c ++ 11 — 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() значение? это потому что foobar() возвращается int?
  3. В общем, зачем вам, если функция является значением или нет? Я думаю, что если я прочитаю оставшуюся часть этой статьи, я получу ответ на этот вопрос.

5

Решение

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

Так:

  1. поскольку foo() возвращает ссылку (int&), что делает его самоценным.
  2. Правильный. foobar() это значение, потому что foobar() возвращается int,
  3. Нас не волнует, является ли функция R-значением или нет. Что нас волнует, так это ссылки R-Value.

Статья, на которую вы указали, интересна, и я раньше не рассматривал пересылку или ее использование на фабриках. Причиной, по которой я был взволнован ссылками R-Value, была семантика перемещения, например:

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);

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

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]