C ++(为什么)确实移动构造函数删除运算符=

c++ (why) does move constructor delete operator=

本文关键字:构造函数 移动 删除 运算符 为什么      更新时间:2023-10-16

我有一个带有结构体的向量

Struct S {
S( double a, double b ) : a_(a), b_(b) {}
double a_;
double b_;
S(S&&) = default;   //ADDED
}

我使用回置将 s 的实例添加到向量中

v.emplace_back( x, y );

由于似乎不能保证编译器会添加移动构造函数,我认为添加默认的移动构造函数没有害处,所以我添加了注释为 ADD 的行。 但是,这似乎禁用了运算符=,因为我收到编译错误

/opt/rh/devtoolset-3/root/usr/include/c++/4.9.2/bits/stl_algo.h:868: error: use of deleted function ‘S& S::operator=(const S&)’
*__result = _GLIBCXX_MOVE(*__first);
^

我不明白为什么会这样。我的 S(S&&( 实现方式是否错误?

编辑: 使用擦除删除时引发错误

v.erase(std::remove_if(v.begin(), v.end(), deleteIf), v.end());

将自动提供默认的复制赋值运算符(执行成员复制(,除非该类声明复制赋值运算符、删除复制赋值运算符或声明移动操作。这样做的原因是编译器假定,如果您声明任何移动操作,则您的类可能包含不应复制的数据,因此它强制您自己实现复制赋值运算符,以尝试强制执行五法则。

有一个很好的图表,显示了此幻灯片(幻灯片 30(中何时提供了默认构造函数和赋值运算符。

STL 容器的一些较旧的实现在调整基础容器的大小时使用赋值运算符。为了调整大小,他们分配内存,默认构造初始对象,使用赋值运算符将对象复制到新容器,然后释放以前的对象。

在相关主题上,如果要使对象可移动可构造,则还应使其可移动可分配。

由于结构中唯一的数据成员是 double's - 不分配资源的基元类型 - 因此此结构不需要移动构造函数。