std::move 是否调用纯右值解构对象?

Does std::move called on a prvalue deconstruct the object?

我编写了这样的代码,将 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

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

std::move是函数调用;它不是 C++ 的神奇运算符。它所做的只是 return 对给定对象的引用。并通过引用获取其参数。

在 C++ 中,如果您有一个纯右值,并将其传递给一个引用它的函数,则由该纯右值创建的临时值只会持续到表达式结束。

因此 move return 是对临时文件的引用。但是在 myObj1 初始化后,该临时文件将立即被销毁。所以 myObj1 是对已销毁对象的引用。