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

时间:2018-04-20 07:56:12

标签: c++ c++11 language-lawyer rvalue-reference lvalue

在尝试理解右值引用的工作原理时,我最终得到了这段代码:

int* iptr = nullptr;
int*&& irr = iptr;

编译上面的代码会出现以下错误:

  

错误:对'int *'类型的右值引用无法绑定到类型的左值   'int *'

我理解这是正确的,但为什么下面的代码(使用void*而不是int*进行绑定)编译没有任何问题?运行时行为是正确的还是我应该期待未定义的行为?

int* iptr = nullptr;
void*&& irr = iptr;

2 个答案:

答案 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);