下面是Foo类,我为其创建了一个复制构造函数,复制赋值运算符和一个移动构造函数。
class Foo
{
public:
Foo() = default;
Foo(Foo const& other) //copy ctor
{
if (other.i != nullptr)
i = new int(*other.i);
}
Foo& operator=(Foo const& other) //assignment operator
{
if (other.i != nullptr)
i = new int(*other.i);
return *this;
}
Foo& operator=(Foo&& other) //move ctor. I'm not sure whether this can //be used as a move ctor
{
if (other.i != nullptr)
{
i = other.i;
other.i = nullptr;
}
return *this;
}
~Foo()
{
if (i != nullptr)
{
delete i;
i = nullptr;
}
}
int *i = nullptr;
};
当我写下代码时,
Foo f2;
f2.i = new int(43);
Foo f1 = std::move(f2);
它调用复制构造函数而不是移动构造函数。 但是当我写下面的时候,
Foo f2;
f2.i = new int(43);
Foo f1;
f1 = std::move(f2);
它调用我定义的移动构造函数。任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
您提供了移动分配,但未提供移动构造函数。当我添加一个(下面)时,我按预期使用移动操作。
Foo(Foo && other) noexcept
{
std::cout << "Move ctor\n";
i = other.i;
other.i = nullptr;
}
注意使用noexcept
;您也可以将它添加到移动赋值运算符中。