使用 `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);