5

просматривая стандарт, я заметил что в нем различают l-value и r-value ссылки, в отличие от тех же указателей например. Почему так? И что такое r-value ссылка, я просто так и не понял.

n 1 k z z z
  • 1,491
  • 6
  • 23

1 Answers1

2

Наиболее важной особенностью С++11, вероятно, является семантика перемещения, а основой семантики перемещения является отличие rvаluе-выражений от lvаluе-выра­жений.

Полезной эвристикой для выяснения, является ли выражение lvalue, является ответ на вопрос, можно ли получить его адрес. Если можно, то обычно это lvalue. Если нет, это обычно rvalue.

(Из книги "Эффективный и современный С++. 42 рекомендации по использованию С++11 и С++14" Скотта Мейерса)

lvalue сокращенно от left-value, a rvalue - right-value. Пример:

 var = true;

var - lvalue(занимает какое-то идентифицируемое место в памяти т.е. имеет адрес, можно также изменять), true - rvalue. В общем, rvalue-выражения временны и недолговечны(область видимости выражения), в то время как lvalue живут дольше, поскольку существуют как переменные. Но если использовать rvalue ссылки, можно добится расширения области видимости.

Ссылки бывают rvalue(&&) так и lvalue(&):

Class& lvalue = obj;
Class&& rvalue = obj;

Стоит заметить, что можно сделать так:

 Class&& rvalue = Class();

Что не сделаешь для обычних ссылок. Rvalue ссылка ведет себя точно так же, как и lvalue ссылка, за исключением того, что она может быть связана с временным объектом, тогда как lvalue связать с временным (не константным) объектом нельзя.

HolyBlackCat
  • 27,445
  • 3
  • 27
  • 40