我有一个带结构的向量
Struct S {
S( double a, double b ) : a_(a), b_(b) {}
double a_;
double b_;
S(S&&) = default; //ADDED
}
然后我使用emplace将s的实例添加到向量
v.emplace_back( x, y );
由于doesn't seem要保证编译器会添加一个移动构造函数,我认为添加默认移动构造函数没有坏处,所以我添加了注释为ADDED的行。 但是,这似乎已经禁用了operator =因为我得到了编译错误
/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&&)执行方式是错误的吗?
编辑: 使用erase-remove
时会引发错误v.erase(std::remove_if(v.begin(), v.end(), deleteIf), v.end());
答案 0 :(得分:3)
将自动提供默认的复制赋值运算符(执行成员复制),除非该类声明了复制赋值运算符,删除了复制赋值运算符,或声明了移动操作。原因是编译器假定如果您声明任何移动操作,则您的类可能包含不应复制的数据,因此它会强制您自己实现复制赋值运算符,以尝试强制执行Rule of Five
有一个很好的图表显示了this slideshow,幻灯片30中提供默认构造函数和赋值运算符的时间。
答案 1 :(得分:2)
一些较旧的STL容器实现在调整基础容器大小时使用赋值运算符。要调整大小,它们会分配内存,默认构造初始对象,使用赋值运算符将对象复制到新容器,然后释放以前的对象。
在相关主题上,如果您要创建对象Move-Constructible,还应该将其设为Move-Assignable。
由于结构中唯一的数据成员是double - 不分配资源的基本类型 - 您不需要此结构的移动构造函数。