Привязать значение rvalue к lvalue с помощью 'void *'

Пытаясь понять, как работают ссылки на rvalue, я закончил с этим фрагментом кода:

int* iptr = nullptr;
int*&& irr = iptr;

Компиляция приведенного выше кода дает следующую ошибку:

error: ссылка rvalue на тип 'int *' не может связываться с lvalue типа 'int *'

Я понимаю, что это правильно, но почему следующий код, где я связываю использование void* вместо int*, компилируется без каких-либо проблем? Верно ли поведение во время выполнения, или я должен ожидать неопределенного поведения?

int* iptr = nullptr;
void*&& irr = iptr;

Ответ 1

Это хорошо сформировано.

int* и void* - разные типы; вы не можете напрямую привязать int* к ссылке на void*. int* необходимо преобразовать в void* во-первых, что является временным объектом и может быть привязан к rvalue-reference. (PS время жизни временного увеличивается до времени жизни ссылки).

Обратите внимание, что irr не привязывается к iptr; поэтому любая модификация на нем не имеет ничего общего с iptr.

Это не является особым для void*, то же самое происходит и для других типов, например

char c;
int&& r = c; // a temporary int is constructed from c and then bound to r;
             // its lifetime is extened to the lifetime of r

Ответ 2

В дополнение к @songyuanyao ответ: вы можете сделать rvalue из iptr например, с помощью static_cast:

  int* iptr = nullptr;
  int*&& irr = static_cast<int *>(iptr);