使用 `void*` 将右值引用绑定到左值
Bind rvalue reference to lvalue with `void*`
在尝试理解右值引用的工作原理时,我得到了这段代码:
int* iptr = nullptr;
int*&& irr = iptr;
编译以上代码出现以下错误:
error: rvalue reference to type 'int *' cannot bind to lvalue of type
'int *'
我理解这是正确的,但为什么下面的代码(我使用 void*
而不是 int*
进行绑定)编译没有任何问题?运行时行为是正确的还是我应该期待未定义的行为?
int* iptr = nullptr;
void*&& irr = iptr;
这是合式的。
int*
和void*
是不同的类型;您不能将 int*
直接绑定到对 void*
的引用。 int*
需要先转换为 void*
,这是一个临时对象,可以绑定到右值引用。 (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
除了@songyuanyao 回答:你可以从 iptr
中得到一个右值,例如通过 static_cast
:
int* iptr = nullptr;
int*&& irr = static_cast<int *>(iptr);
在尝试理解右值引用的工作原理时,我得到了这段代码:
int* iptr = nullptr;
int*&& irr = iptr;
编译以上代码出现以下错误:
error: rvalue reference to type 'int *' cannot bind to lvalue of type 'int *'
我理解这是正确的,但为什么下面的代码(我使用 void*
而不是 int*
进行绑定)编译没有任何问题?运行时行为是正确的还是我应该期待未定义的行为?
int* iptr = nullptr;
void*&& irr = iptr;
这是合式的。
int*
和void*
是不同的类型;您不能将 int*
直接绑定到对 void*
的引用。 int*
需要先转换为 void*
,这是一个临时对象,可以绑定到右值引用。 (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
除了@songyuanyao 回答:你可以从 iptr
中得到一个右值,例如通过 static_cast
:
int* iptr = nullptr;
int*&& irr = static_cast<int *>(iptr);