【发布时间】:2022-01-12 16:53:57
【问题描述】:
我有两段相似的代码。第一个版本意外调用了默认构造函数,而第二个版本没有。它们都按预期分别调用了移动运算符/移动构造函数。
class MyResource
{
public:
MyResource() : m_data(0) { std::cout << "Default Ctor" << std::endl; }
MyResource(int data) : m_data(data) { std::cout << "Int Ctor" << std::endl; }
MyResource(MyResource const& other) = delete;
MyResource& operator=(MyResource const& other) = delete;
MyResource(MyResource&& other) noexcept : m_data(other.m_data) { std::cout << "Move Ctor" << std::endl; }
MyResource& operator=(MyResource&& other) noexcept { std::cout << "Move Op" << std::endl; m_data = other.m_data; return *this; }
~MyResource() { std::cout << "Dtor" << std::endl; }
private:
int m_data = 0;
};
class MyWrapper
{
public:
MyWrapper(MyResource&& resource)
// : m_resource(std::move(resource)) // Version 2
{
// m_resource = std::move(resource); // Version 1
}
private:
MyResource m_resource;
};
我的测试用法是:
MyWrapper* wrapper = new MyWrapper(MyResource(1));
delete wrapper;
使用版本 1,我得到:
Int Ctor
默认Ctor
移动操作
Dtor
管理员
虽然版本 2 输出:
内测
移动角色
Dtor
管理员
造成这种差异的原因是什么?
为什么版本 1 会调用默认构造函数?
【问题讨论】:
标签: c++ move-semantics