c ++(为什么)移动构造函数delete operator =

时间:2017-08-08 04:42:28

标签: c++

我有一个带结构的向量

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());

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

在相关主题上,如果您要创建对象Move-Constructible,还应该将其设为Move-Assignable

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