这里有一段代码,因为push_back尝试调用已删除的MoveOnlyClass中的复制构造函数而无法编译:
class MoveOnlyClass
{
public:
MoveOnlyClass() {};
MoveOnlyClass& operator=(const MoveOnlyClass& other) = delete;
MoveOnlyClass(const MoveOnlyClass& other) = delete;
};
int main()
{
std::vector<MoveOnlyClass> vec;
vec.push_back(std::move(MoveOnlyClass()));
}
为什么会出现这种情况?向量应该只调用移动构造函数。正确的方式是将对象移动到向量中。
=default
添加移动构造函数,而不是假设它已经存在,或者你可以花2分钟查看编译器在什么情况下生成移动构造函数。没有个人恩怨,一个反对票不会伤害任何人,我相信其他人会觉得这篇文章值得点赞,我坚持我的决定 ;) - 463035818_is_not_a_numbernoexcept
,那么std::vector
将使用拷贝构造函数。(但默认的移动构造函数在适当的情况下会自动成为noexcept
。) - Daniel Schepler