众所周知,以下示例表现出未定义的行为:
T const x = T();
T& r = any_suitable_conversion_to_Tref(x); // fine
r = T(); // UB
[const_cast
确认为cppreference:
const_cast使得可以形成实际上指向const对象的非const类型的引用或指针,或者实际上指向易失性对象的非volatile类型的引用或指针。通过非常量访问路径修改const对象,并通过非易失性glvalue引用volatile对象会导致未定义的行为。
但是,它没有说明例如c样式的转换,它不引用标准(cppreference通常从不引用)。
C ++标准到底在哪里禁止这样做?
C ++ 17标准在[dcl.type.cv] 10.1.7下的第10章“声明”中声明:
- [除非声明了
mutable
(10.1.1)的任何类成员都可以修改,否则在其生存期(6.8)内尝试修改const
对象都会导致未定义的行为。