首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ (为什么)会移动构造函数删除operator=

c++ (为什么)会移动构造函数删除operator=
EN

Stack Overflow用户
提问于 2017-08-08 04:42:27
回答 2查看 95关注 0票数 0

我有一个带有结构的向量

代码语言:javascript
复制
Struct S {
    S( double a, double b ) : a_(a), b_(b) {}
    double a_;
    double b_;
    S(S&&) = default;   //ADDED
}

我使用emplace将s的实例添加到向量中。

代码语言:javascript
复制
v.emplace_back( x, y );

由于要保证编译器会添加移动构造函数,所以我认为添加默认的移动构造函数没有坏处,所以我添加了注释为似乎的行。但是,当我得到编译错误时,这似乎已经禁用了operator=。

代码语言:javascript
复制
/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&)的实现是错误的吗?

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

代码语言:javascript
复制
v.erase(std::remove_if(v.begin(), v.end(), deleteIf), v.end());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-08 04:54:39

除非类声明副本赋值操作符、删除副本赋值操作符或声明移动操作,否则将自动提供默认的副本赋值操作符(执行成员级副本)。原因是编译器假设如果声明任何移动操作,那么类很可能包含不应该复制的数据,因此它强制您自己实现复制赋值操作符,以尝试强制执行五条规则

有一个很好的图表显示默认构造函数和赋值操作符是在这个幻灯片,幻灯片30中提供的。

票数 3
EN

Stack Overflow用户

发布于 2017-08-08 04:53:10

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

在一个相关的主题上,如果要创建一个对象移动-可构造,也应该使其为移动-可转让

因为在您的结构中唯一的数据成员是double's --不分配资源的基本类型--因此您不需要这个结构的移动构造函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45559426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档