【问题标题】:How the move semantic work for make_unique?make_unique 的移动语义如何工作?
【发布时间】:2020-12-17 07:20:28
【问题描述】:

在代码中:

accounts.push_back(make_unique<Checking_Account>("James",1000));

我知道这是一个未命名的临时 Checking_Account 对象,它会移动到一个向量,但“移动”是如何工作的?我假设Checking_Account 类没有“移动”构造函数。 push_back 方法会调用复制构造函数,但make_unique 是唯一指针,因此不允许复制或赋值。

临时的Checking_Account对象是R值引用会调用一个移动构造函数,但是如果我没有在任何类中定义一个移动构造函数,代码仍然可以正常运行。在我的理解中,可能已经在智能指针类中定义了移动构造函数,或者编译器会复制 elison,即编译器会为我们执行移动构造函数,但我们不会看到这个?我不确定哪个是正确的。

【问题讨论】:

  • 如果您可以格式化您的问题、您的代码并为您使用的编程语言添加标签,那将会很有帮助。

标签: unique-ptr move-semantics


【解决方案1】:

make_unique 的实现将使用与Checking_Account("James", 1000) 最匹配的Checking_Account 构造函数在堆上new 一个Checking_Account。一旦Checking_Account 在堆上,就不需要移动或复制它。

unique_ptr 将指向堆上的Checking_Account,当unique_ptr 需要移动时,它会简单地将指向Checking_Account 的指针传递给下一个unique_ptr,而原来的@ 987654332@ 会将其指针设置为nullptr。

【讨论】:

  • 但是没有智能指针 std::move() 方法,未命名的临时对象 Chencking_Account 如何移动到向量中。因为如果 Chencking_Account 移动调用移动构造函数或 std::move() 方法。在这种情况下,没有类定义移动构造函数,我没有使用 std::move() 方法。
  • vector 移动unique_ptr&lt; Checking_Account &gt;。不是Checking_Account。
  • 这意味着如果我们有vector 我们不需要提供移动构造函数vector 会为我们移动吗?因为我在另一个班级工作。 vec.push_back(Move{10}); Move 类是简单的类,并且有复制构造函数。当我执行 vec.push_back(Move{10}); 时,它会调用复制构造函数。如果vector 可以移动对象,为什么编译器在这种情况下调用复制构造函数?
  • 在您的问题中暗示了vector&lt;unique_ptr&lt;Checking_Account&gt;&gt;,并且在我的回答中假定了该类型。 unique_ptr 提供 vector&lt;unique_ptr&lt;Checking_Account&gt;&gt; 使用的移动构造函数。
  • 我知道你的手段。谢谢。霍华德
猜你喜欢
  • 2021-11-19
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多