Согласно стандарту C++, можно отбрасывать const
от указателя и записывать в объект, если объект изначально не является const
. Так что это:
const Type* object = new Type();
const_cast( object )->Modify();
- нормально, а это:
const Type object;
const_cast( &object )->Modify();
- UB.
Аргументация такова, что когда сам объект является const
, компилятору разрешается оптимизировать доступ к нему, например, не выполнять повторные чтения, потому что повторные чтения не имеют смысла для объекта, который не меняется.
Вопрос в том, как компилятор узнает, какие объекты действительно являются const
? Например, у меня есть функция:
void function( const Type* object )
{
const_cast( object )->Modify();
}
и она скомпилирована в статическую либу, и компилятор не знает, для каких объектов она будет вызвана.
Теперь вызывающий код может сделать так:
Type* object = new Type();
function( object );
и все будет нормально, а может сделать так:
const Type object;
function( &object );
и это будет неопределенное поведение.
Как компилятор должен придерживаться таких требований? Как он должен заставить работать первое, не заставляя работать второе?