根据 C++ 标准,如果对象最初不是本身,则可以放弃const
指针并写入对象。const
这样:
const Type* object = new Type();
const_cast<Type*>( object )->Modify();
没关系,但是这个:
const Type object;
const_cast<Type*>( &object )->Modify();
是UB。
原因是当对象本身是const
允许编译器优化对它的访问时,例如,不执行重复读取,因为重复读取对不变的对象没有意义。
问题是编译器如何知道哪些对象实际上是const
?例如,我有一个功能:
void function( const Type* object )
{
const_cast<Type*>( object )->Modify();
}
它被编译成一个静态库,编译器不知道它将被调用哪些对象。
现在调用代码可以这样做:
Type* object = new Type();
function( object );
它会很好,或者它可以这样做:
const Type object;
function( &object );
这将是未定义的行为。
编译器应该如何遵守这些要求?如何在不让后者工作的情况下让前者工作?