在尝试理解右值引用的工作原理时,我最终得到了这段代码:
int* iptr = nullptr;
int*&& irr = iptr;
编译上面的代码会出现以下错误:
错误:对'int *'类型的右值引用无法绑定到类型的左值 'int *'
我理解这是正确的,但为什么下面的代码(使用void*
而不是int*
进行绑定)编译没有任何问题?运行时行为是正确的还是我应该期待未定义的行为?
int* iptr = nullptr;
void*&& irr = iptr;
答案 0 :(得分:20)
这是良好的形式。
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
答案 1 :(得分:11)
除了@songyuanyao回答:你可以从iptr
中得到一个右值,例如通过static_cast
:
int* iptr = nullptr;
int*&& irr = static_cast<int *>(iptr);