Разница между ссылкой lvalue и ссылкой rvalue - PullRequest
0 голосов
/ 23 мая 2018

Я изучал добавление ссылки на rvalue в C ++ 11.Это было не просто, но я чувствую, что, наконец, начинаю понимать это.Однако есть один конкретный случай, когда я запутался.В частности, я не понимаю, что означает значение «b» в этом примере:

int a = 27;
int&& b = 27;

РЕДАКТИРОВАТЬ: я знаю, что int a = 27 является ссылкой lvalue, а не lvalue.

Такжея ищу не то, что int && b = 27 является , а что это означает интуитивно.Я в замешательстве, потому что я думал, что rvalue там, где нет адреса, но здесь у нас есть ссылка на rvalue, что означает, что мы можем обратиться к нему.Так почему же это все еще ценность?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

int a = 27; является оператором и не является ни lvalue, ни rvalue.Он определяет имя a, которое можно использовать как lvalue выражение типа int.

int&& b = 27; также является оператором , а имя b используется как lvalue выражение типа int&& и разрешает преобразование в xvalueвыражение типа int

0 голосов
/ 23 мая 2018

но здесь у нас есть ссылка на rvalue, что означает, что мы можем обратиться к нему.Так почему же это все еще значение?

Учитывая int&& b = 27;, временный int создается из 27, а затем b связывается с временным.(И срок действия временного объекта увеличивается до срока действия b.) После этого, если вы получите адрес, такой как &b, вы получите адрес временного.

BTW b сам по себе является lvalue.

Временные объекты создаются when a prvalue is materialized so that it can be used as a glvalue, which occurs (since C++17) в следующих ситуациях:

  • , связывающих ссылку наprvalue

КСТАТИ: Это не специально для ссылки rvalue;то же самое происходит для const int& b = 27;.

0 голосов
/ 23 мая 2018

B является ссылкой rvalue, и вы можете назначить ей только rvalue.

...