Насколько я понимаю, это будет UB, только если рассматриваемый объект является в основном const-объектом, а не const-указателем или ссылкой на объект, который не был изначально
Идея состоит в том, что данные, которые в основном являются постоянными, могут быть загружены в часть памяти, доступную только для чтения, и запись в нее просто не будет работать. Тем не менее, он гарантированно будет работать должным образом, если данный объект принципиально изменчив.
Ex:
const int x = 4;
const int *y = x;
*const_cast<int*>(x) = 3; // UB - the pointed-to object may
// be in read-only memory or whatever.
int a = 7;
const int *b = a;
*const_cast<int*>(b) = 6; // Not UB - the pointed-to object is
// fundamentally mutable.
Для комментария ниже, потому что код выглядит ужасно в комментариях:
В §7.1. 5.1 / 4 стандарта приведен пример:
int i = 2;
const int * cip; // pointer to const int
cip = &i; // OK: cv-qualified access path to unqualified
...
int* ip;
ip = const_cast <int *>( cip ); // cast needed to convert const int* to int*
*ip = 4; // defined: *ip points to i, a non-const object
Так что это специально разрешено.