[英]Bind rvalue reference to lvalue with `void*`
在尝试理解右值引用如何工作时,我最终得到了这段代码:
int* iptr = nullptr;
int*&& irr = iptr;
编译上面的代码会出现以下错误:
错误:对'int *'类型的rvalue引用不能绑定到'int *'类型的左值
我理解这是正确的,但为什么下面的代码,我使用void*
而不是int*
绑定,编译没有任何问题? 运行时行为是正确的还是我应该期望未定义的行为?
int* iptr = nullptr;
void*&& irr = iptr;
这是良好的形式。
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
除了@songyuanyao回答:你可以通过static_cast
从iptr
制作一个rvalue:
int* iptr = nullptr;
int*&& irr = static_cast<int *>(iptr);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.