Почему запись в не const объект после отбрасывания const указателя на этот объект не является UB?

Согласно стандарту 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 );

и это будет неопределенное поведение.

Как компилятор должен придерживаться таких требований? Как он должен заставить работать первое, не заставляя работать второе?

6
задан Rann Lifshitz 3 June 2018 в 10:12
поделиться