Я только начал изучать 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
foo()
lvalue? это потому что foo()
возвращается int&
что в основном является lvalue?foobar()
значение? это потому что foobar()
возвращается int
?L-значения — это местоположения, R-значения — фактические значения.
Так:
foo()
возвращает ссылку (int&
), что делает его самоценным.foobar()
это значение, потому что foobar()
возвращается int
,Статья, на которую вы указали, интересна, и я раньше не рассматривал пересылку или ее использование на фабриках. Причиной, по которой я был взволнован ссылками 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);
И пусть он работает так же эффективно, как и второй пример.
Других решений пока нет …