我有一个带有结构的向量
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 );由于要保证编译器会添加移动构造函数,所以我认为添加默认的移动构造函数没有坏处,所以我添加了注释为似乎的行。但是,当我得到编译错误时,这似乎已经禁用了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&)的实现是错误的吗?
编辑:使用擦除时会引发错误。
v.erase(std::remove_if(v.begin(), v.end(), deleteIf), v.end());发布于 2017-08-08 04:54:39
除非类声明副本赋值操作符、删除副本赋值操作符或声明移动操作,否则将自动提供默认的副本赋值操作符(执行成员级副本)。原因是编译器假设如果声明任何移动操作,那么类很可能包含不应该复制的数据,因此它强制您自己实现复制赋值操作符,以尝试强制执行五条规则。
有一个很好的图表显示默认构造函数和赋值操作符是在这个幻灯片,幻灯片30中提供的。
发布于 2017-08-08 04:53:10
一些较旧的STL容器实现在调整底层容器的大小时使用赋值运算符。为了调整大小,它们分配内存,默认构造初始对象,通过使用赋值运算符将对象复制到新容器,然后释放前面的对象。
在一个相关的主题上,如果要创建一个对象移动-可构造,也应该使其为移动-可转让。
因为在您的结构中唯一的数据成员是double's --不分配资源的基本类型--因此您不需要这个结构的移动构造函数。
https://stackoverflow.com/questions/45559426
复制相似问题