Иногда я хочу создавать классы/структуры с const
элементами. Я понимаю, что это плохая идея по нескольким причинам, но ради аргумента давайте представим, что единственная причина в том, что это делает правильно сформированное operator =
хлопотным, если не сказать больше. Тем не менее, я придумал довольно простой обходной путь, как показано в этой структуре:
struct S {
const int i;
S(int i) : i(i) {}
S(const S& other) : i(other.i) {}
S& operator =(const S& other) {
new (this) S(other);
return *this;
}
};
Игнорируя деструкторы и семантику перемещения, есть ли какая-то действительно веская причина, по которой этого не следует делать? Мне кажется, что это более типобезопасная версия
S& operator =(const S& other) {
const_cast<int&>(i) = other.i;
return *this;
}
Итак, краткое изложение вопроса таково: есть ли какая-либо основная причина, по которой размещение-новое не должно использоваться для реализации присваивания копирования, чтобы иметь ту же семантику, что и конструкция копирования?
const
участниками иoperator=
. Это пахнет проблемой дизайна для меня. - person Thomas   schedule 12.07.2019delete
, если вы звонитеnew
по заданию? - person Martin Véronneau   schedule 12.07.2019