c++ 在右值上调用的std::move是否解构对象?

omhiaaxx  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(199)

我写过这样的代码,将std::move应用于临时构造函数中的纯右值。

// a std::string instance in class Obj

  Obj&& myObj1 = std::move(Obj(1,"lost"));
  print(myObj1);

  Obj&& myObj2 = Obj(2,"keep");
  print(myObj2);

打印效果如下所示(构造函数和析构函数中也有print):

Construct lost
Destroy lost
obj1: 

Construct keep
obj2: keep
Destroy keep

stackoverflow中的一些问题说第一种情况应该没有影响,我想知道我的代码中发生了什么。这是std::move函数中的Obj(1, "lost")作为参数并在std::move退出时死亡吗?

ohtdti5x

ohtdti5x1#

std::move是一个函数调用;它不是C中的一个神奇的运算符,它所做的只是返回一个对给定对象的引用,并通过引用获取其参数。
在C
中,如果你有一个纯右值,并且你把它传递给一个引用它的函数,那么由这个纯右值创建的临时变量只会持续到表达式结束。
所以move返回一个对临时变量的引用,但是这个临时变量在myObj1初始化后会立即被销毁,所以myObj1是一个被销毁对象的引用。

相关问题