Привязать значение 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);