У меня есть такая структура:

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 является неконстантным OBJ с константным членом y. Я не могу изменить только у, но я должен быть в состоянии изменить весь объект (вызов деструктора и конструктора). Возможно ли это или единственное правильное решение - удалить мой const до y и не забыть случайно изменить его?

Мне нужно сохранить мой static obj между вызовами func, но если условие истинно, я хочу переместить другой объект вместо этого статического объекта.

1
S.R 8 Сен 2017 в 14:49

3 ответа

Лучший ответ

Я бы предложил перейти к 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
}

Это должен быть ваш выбор во многих случаях, когда необходимо переместить что-то, что не может быть перемещено, чтобы удерживать неизвестный полиморфный тип, или любой другой случай, когда вы не можете иметь дело с реальным типом.

1
Amir Kirsh 10 Сен 2017 в 06:05

Как насчет написания оператора присваивания перемещения следующим образом:

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)
{
}
1
Miroslav Mares 8 Сен 2017 в 11:57

Вы делаете конструкторы неправильно. Конструкторы должны инициализировать , а не назначать:

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

Кроме того, конструкторы не могут return *this, так как они не имеют возвращаемого типа.

Оператор присваивания для вашего класса не имеет смысла, так как класс имеет неназначаемые члены (а именно, константы). (Конечно, вы можете написать собственное назначение, которое не изменяет член const, но тогда у вас будет действительно странный класс, который ведет себя крайне удивительно.)

1
Kerrek SB 8 Сен 2017 в 11:53