константный член и оператор присваивания. Как избежать неопределенного поведения?

Я ответил на вопрос о std :: vector объектов и константной корректности и получил комментарий о неопределенном поведении. Я не согласен, поэтому у меня есть вопрос.

Рассмотрим класс с членом const:

class A { 
public: 
    const int c; // must not be modified! 
    A(int c) : c(c) {} 
    A(const A& copy) : c(copy.c) { }     
    // No assignment operator
}; 

Я хочу иметь оператор присваивания, но не хочу использовать const_cast , как в следующем коде из одного из ответов:

A& operator=(const A& assign) 
{ 
    *const_cast (&c)= assign.c;  // very very bad, IMHO, it is undefined behavior
    return *this; 
} 

Мое решение:

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

Есть ли у меня неопределенное поведение ( UB)?

Что было бы решением без UB?

33
задан E_net4 says Reinstate 20 June 2019 в 13:47
поделиться