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