template <class T> constexpr T* launder(T* p) noexcept;
struct X { const int n; }; X *p = new X{3}; const int a = p->n; new (p) X{5}; // p does not point to new object ([basic.life]) because X::n is const const int b = p->n; // undefined behavior const int c = std::launder(p)->n; // OK