Существует много связанных с 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);
вопросы являются:
- Когда именно делает агд стать именующее?
- Каким будет тип arg, если функция была недействительной, а b) и c) строк не было?
- Публикация статей (только со ссылкой на первое найденное result) говорит, что может быть неявное значение lvalue для преобразования rvalue, но противоположное направление невозможно - почему? Этот пример показывает, что
arg
-s преобразован изint&&
вint&
, а затем пытается неявно конвертироватьint&
вint&&
, что вызывает ошибку компиляции - просто противоположное поведение! Вот почему нам нуженstd::move
, в основе которого лежит явный тип static_cast для rvalue.
* «Именованная ссылка является ссылкой на lvalue» *, категория значений является свойством выражений, а не переменных/ссылок/и т. Д. –