изменение адреса после преобразования ссылки на rvalue - PullRequest
0 голосов
/ 12 октября 2018
#include <iostream>
using namespace std;

int main()
{
  int i = 0;
  cout << &i << endl;

  const auto &ref = (short&&)i;
  cout << &ref << endl;

  return 0;
}

Почему &i отличается от &ref?(short&)i не вызывает этой проблемы.(short&&)i генерирует временную переменную?

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

Это создает ссылку lvalue на существующую вещь:

const auto& ref = i;

Поэтому выражения &ref и &i будут давать тот же результат.

Это также верно для:

const auto& ref = (int&)i;

, что в основном то же самое.

Однако приведение к чему-либо, что не является ссылкой lvalue на T (то есть на значение или на ссылку rvalueдругого типа!) должен создать временный;этот временный интервал продлевается на весь срок жизни, если он связан с ref.Но теперь ref не «ссылается» на i, поэтому адрес результатов будет отличаться.

На самом деле это немного сложнее, чем , но вы понимаете,,Кроме того, не пишите такой код!int не является short, и вы не можете притворяться, что это так.

0 голосов
/ 12 октября 2018

Видимо это создает временный.

Собственно компилятор скажет вам сам.Попробуйте это:

auto &ref = (short&&)i;
cout << &ref << endl;

Ошибка говорит:

ошибка: неконстантная lvalue ссылка на тип «short» не может привязаться к временному типу «short»

Тестовый код здесь .

0 голосов
/ 12 октября 2018

Это потому, что вы делаете другой тип каста.Приведение явного преобразования в стиле C всегда выполняет статическое приведение, если оно может быть интерпретировано как статическое приведение;в противном случае он выполняет реинтерпретацию.И / или константное приведение по необходимости.

(short&&)i является статическим приведением, поскольку его можно интерпретировать как static_cast<short&&>(i).Он создает временный объект short, к которому привязан ref.Будучи другим объектом, он имеет другой адрес.

(short&)i - это переосмысленное приведение, потому что его нельзя интерпретировать как static_cast<short&>(i), который плохо сформирован.Он интерпретирует ссылку int как краткую ссылку, и ref привязывается к тому же объекту.Обратите внимание, что доступ к объекту через эту ссылку будет иметь неопределенное поведение.

0 голосов
/ 12 октября 2018

(short&&)i создает временный объект, поэтому вы берете адрес другого объекта, поэтому адрес может отличаться.

...