将赋值移动到具有const值的对象

时间:2017-09-08 11:49:24

标签: c++ c++11 move

我有这样的结构:

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之间,但如果条件为真,我想移动其他对象来代替此静态对象。

3 个答案:

答案 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)
{
}