присвоение класса константному члену

Рассмотрим следующий код:

struct s
{
    const int id;

    s(int _id):
        id(_id)
    {}
};
//...
vector<s> v;  v.push_back(s(1));

Я получаю сообщение об ошибке компилятора, что «const int id» не может использовать оператор присваивания по умолчанию.

Q1. Почему для push _назад ()нужен оператор присваивания?
А1. Потому что так говорит текущий стандарт С++.

Q2. Что я должен делать?

  • Я не хочу отказываться от спецификатора const
  • Я хочу, чтобы данные были скопированы

А2. Я буду использовать умные указатели.

Q3. Я придумал "решение", которое кажется довольно безумным:

s& operator =(const s& m)
{
    if(this == &m) return *this;
    this->~s();
    return *new(this) s(m);
}

Должен ли я этого избегать и почему (если да )? Безопасно ли использовать новое размещение, если объект находится в стеке?

10
задан curiousguy 7 July 2018 в 00:53
поделиться