【发布时间】:2014-05-24 21:07:27
【问题描述】:
以下代码在 gcc 4.8.0 (mingw-w64) 和 -O2 -std=c++11 -frtti -fexceptions -mthreads 中失败
#include <string>
class Param
{
public:
Param() : data(new std::string) { }
Param(const std::string & other) : data(new std::string(other)) { }
Param(const Param & other) : data(new std::string(*other.data)) { }
Param & operator=(const Param & other) {
*data = *other.data; return *this;
}
~Param() {
delete data;
}
Param & operator=(Param &&) = delete;
private:
std::string * data;
};
int main()
{
Param param;
param = Param("hop");
return 0;
}
出现错误:错误:使用已删除的函数'Param& Param::operator=(Param&&)' 上线:
param = Param("hop");
如果我删除移动赋值删除行,编译会很好。
应该没有默认的移动赋值运算符,因为有用户定义的拷贝构造函数、用户定义的拷贝赋值和析构函数,所以删除它应该不会影响编译,为什么会失败? 为什么分配根本不使用复制分配?
【问题讨论】:
-
我不会评论你的问题,只是你使用了错误的构造函数。您应该使用构造函数的初始化列表,如下所示:
Param():data(new std::string){},否则您将进行一些奇怪的初始化然后赋值。 -
好的,我对代码做了一些更改以修复一些错误并回答 cmets,但这不会改变结果
-
= delete的意思是“调用这个函数是错误的”,而不是“从重载集中删除这个函数”。 -
@Casey:我一直忘记这一点,我讨厌它。它应该将其从重载集中删除,并使用复制分配代替。
-
@MooingDuck :您编辑的问题是正确的,这是分配而不是构造。我仍然错误地假设编译器会将其优化为一个简单的构造函数,就好像我写了 Param param("hop");
标签: c++ c++11 constructor move-semantics