我有这样的结构:
struct OBJ {
int x;
const int y;
OBJ& operator=(OBJ &&oth)
{
y = oth.y; // this is disallowed
return *this;
}
}
示例代码
void func() {
static OBJ obj;
OBJ other; // random values
if(conditon)
obj = std::move(other); //move
}
我理解这一点,因为obj
是 Non const OBJ与const成员y
。我不能改变y,但我应该能够改变整个对象(调用析构函数和构造函数)。这是可能的,还是唯一合适的解决办法就是在const
之前移除我的y
,并记住不要意外改变?
我需要将static obj
存储在func
之间,但如果条件为真,我想移动其他对象来代替此静态对象。
答案 0 :(得分:1)
你正在构造错误。构造函数应该初始化,而不是分配:
OBJ(OBJ &&oth) : y(oth.y) {}
// ^^^^^^^^^^
此外,构造函数不能return *this
,因为它们没有返回类型。
您的类的赋值运算符没有意义,因为该类具有不可分配的成员(即常量)。 (你当然可以编写一个不修改const成员的自定义赋值,但是你会有一个真正奇怪的类,它具有非常令人惊讶的行为。)
答案 1 :(得分:1)
我建议转到std::unique_ptr
:
void func() {
static std::unique_ptr<OBJ> obj = std::make_unique<OBJ>();
std::unique_ptr<OBJ> other = std::make_unique<OBJ>(); // random values
if(condition)
obj = std::move(other); //move
}
在许多需要移动无法移动的内容,保存未知的多态类型或任何其他无法处理实际类型的情况下,这应该是您的选择。
答案 2 :(得分:0)
如何以这种方式编写移动赋值运算符:
OBJ& operator=(OBJ&& other) {
this->~OBJ();
new(this) OBJ(other.x, other.y);
return *this;
}
您还需要一个构造函数:
OBJ(const int x, const int y)
: x(x), y(y)
{
}