C ++(为什么)确实移动构造函数删除运算符=
c++ (why) does move constructor delete operator=
我有一个带有结构体的向量
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 - 不分配资源的基元类型 - 因此此结构不需要移动构造函数。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中