繁体   English   中英

使用`void *`将右值引用左值引用到左值

[英]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_castiptr制作一个rvalue:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM