move assignment to object with const value

杀马特。学长 韩版系。学妹 提交于 2020-03-23 18:40:22

问题


I have a struct like this:

struct OBJ {
  int x;
  const int y;
  OBJ& operator=(OBJ &&oth)
  {
    y = oth.y; // this is disallowed
    return *this;
  }
}

And an example code

void func() {
  static OBJ obj;
  OBJ other; // random values
  if(conditon)
    obj = std::move(other); //move
}

I understand this as obj is Non const OBJ with const member y. I can't change just y but I should be able to change whole object (call destructor and constructor). Is this possible or the only proper solution is to remove my const before y, and remember to don't change by accident?

I need to store my static obj between func call but if condition is true i want to move other object in place of this static object.


回答1:


I would suggest moving to 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
}

This should be your choice in many cases where there is a need to move something that cannot be moved, to hold an unknown polymorphic type or any other case where you cannot deal with the actual type.




回答2:


You're doing constructors wrong. Constructors should initialize, not assign:

OBJ(OBJ &&oth) : y(oth.y) {}
//             ^^^^^^^^^^

Also, constructors cannot return *this, since they have no return type.

An assignment operator for your class doesn't make sense since the class has unassignable members (namely constants). (You could of course write a custom assignment that doesn't modify the const member, but then you'd have a truly weird class that has extremely surprising behaviour.)




回答3:


What about writing the move-assignment operator this way:

OBJ& operator=(OBJ&& other) {
    this->~OBJ();
    new(this) OBJ(other.x, other.y);
    return *this;
}

You would also need a constructor:

OBJ(const int x, const int y)
    : x(x), y(y)
{
}


来源:https://stackoverflow.com/questions/46115831/move-assignment-to-object-with-const-value

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!