私の理解では、問題のオブジェクトが基本的に const ポインターではなく const オブジェクトである場合、または元々 const ではなかったオブジェクトへの参照である場合にのみ、UB になるということです。
基本的に const であるデータをメモリの読み取り専用部分にロードでき、そこへの書き込みは機能しないという考えです。ただし、問題のオブジェクトが基本的に可変である場合は、適切に機能することが保証されています。
元:
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
したがって、これは特に許可されています。