Рассмотрим этот игрушечный пример:

struct A { int x; };
int main() {
    A&& a=A(); 
    return 0;
}
  1. Существует ли неявное приведение из временных значений (значений встроенного типа и временных объектов) к объектам типа rvalue reference?

  2. Есть ли у a адрес?

c++
-5
Stav Alfi 25 Дек 2017 в 19:12

1 ответ

Лучший ответ
  1. Существует ли неявное приведение из временных значений (значений встроенного типа и временных объектов) к объектам типа rvalue reference?

Во-первых, придирка: приведение по определению является явным преобразованием, поэтому неявного преобразования быть не может. Кроме того, ссылка явно не является типом объекта. Это может даже не потребовать хранения. Ссылки привязаны к объектам. Было бы правильнее рассматривать их как альтернативные имена объектов. В частности, ссылки Rvalue могут связываться только с объектами определенного типа. Это примерно все «безымянные» и «временные» значения. Мы также можем привести к ссылке rvalue, чтобы объект был обозначен как «истекает срок действия».

Однако здесь есть один сложный момент: как только ссылка rvalue привязывается к объекту, она больше не «безымянная». В частности, это означает, что, используя эту ссылку, мы вызываем объект «по имени» и таким образом получаем lvalue. Более того, и, чтобы совпасть с этим, привязка ссылки в области видимости блока к временному объекту продлевает время жизни временного объекта до конца области действия. И это подводит нас к следующему пункту.

  1. Есть ли у a адрес?

И да и нет. Сама ссылка может потребовать или не потребовать хранения, как я сказал ранее. Но это спорный вопрос, поскольку это просто название объекта. Принятие адреса ссылки даст адрес привязанного к ней объекта. В этом случае это будет адрес временно привязанного к нему.

2
StoryTeller - Unslander Monica 25 Дек 2017 в 16:33