【问题标题】:Does std::move called on a prvalue deconstruct the object?对纯右值调用的 std::move 是否解构对象?
【发布时间】:2021-11-02 17:21:07
【问题描述】:

我已经编写了这样的代码,将std::move 应用于来自临时构造函数的prvalue。

  // 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 退出时死亡吗?

【问题讨论】:

  • Obj(1,"lost") 一个右值。 std::move 会将其转换为右值,因此它实际上是无操作的。请发minimal reproducible example
  • @Enlico 对不起,我已经阅读了该页面并模仿了其他帖子,在这种情况下是否意味着我应该提供一个最小的可编译代码而不是遗漏细节?
  • 您的代码不能按原样使用。使其可以复制、粘贴、编译和运行。

标签: c++ move-semantics rvalue-reference rvalue stdmove


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多