2016-05-25 1 views
0

Существует много связанных с rvalue quiestion, но я не нашел ответов на эти точные вопросы.Правило преобразования lvalue и правило «named-refs-are-lvalues»

Я не могу обернуть свой разум вокруг «Именованная ссылка - это правило ссылки на lvalue».

Это кажется очень странным - мы объявляем ссылку как RValue, но так как мы должны каким-то образом использовать эту ссылку (в противном случае, какой смысл?), Мы называем его, и так как он назвал это именующее после все!

Рассмотрим этот код:

1 int&& foo(int&& arg) 
2 { 
3  arg = 10; 
4  return arg; // ERROR, `arg` is an lvalue since it's named! 
5 } 
6 foo(1); 

вопросы являются:

  1. Когда именно делает агд стать именующее?
  2. Каким будет тип arg, если функция была недействительной, а b) и c) строк не было?
  3. Публикация статей (только со ссылкой на первое найденное result) говорит, что может быть неявное значение lvalue для преобразования rvalue, но противоположное направление невозможно - почему? Этот пример показывает, что arg -s преобразован из int&& в int&, а затем пытается неявно конвертировать int& в int&&, что вызывает ошибку компиляции - просто противоположное поведение! Вот почему нам нужен std::move, в основе которого лежит явный тип static_cast для rvalue.
+2

* «Именованная ссылка является ссылкой на lvalue» *, категория значений является свойством выражений, а не переменных/ссылок/и т. Д. –

ответ

2

arg переменная имеет тип int&& и не имеет значения.

arg выражение (это выражение в строках 3 и 4) имеет типа int и значение категории «именующая»

-значение для преобразования RValue изменяет категорию значения выражения, без изменения его типа. Если вы напишете arg+1 внутри функции, выражение lvalue arg типа int подвергнется этому преобразованию, чтобы произвести выражение prvalue типа int, так как это то, что требуется встроенному +.

Там нет «именующие к RValue» или обратное преобразование между Int & и Int & & потому что выражения никогда не имеют ссылочные типов. Ошибка в вашей программе - это отказ связать ссылку rvalue (типа int & &) на выражение lvalue (типа int).

Смежные вопросы