Что говорят стандарты про изменение состояния не константного объекта и видимость этих изменений через указатель на константу?

Подскажите, пожалуйста, что стандарты языков C и C++ говорят про следующую ситуацию:

Допустим, есть статический не константный объект:

static Object object;

Я хочу использовать его в качестве промежуточного буфера, в который библиотека выкладывает результаты работы своих функций. Для этого, я предоставляю пользователю функцию, через которую он может получить указатель на этот объект:

const Object* get_object()
{
    return &object;
}

При этом, я возвращаю пользователю указатель на константное значение, чтобы пользователь мог лишь читать из этого объекта.

Работа с библиотекой может осуществляться так:

const Object*const object = get_object();

do_something_1();

// Read info from object.

do_something_2();

// Read info from object again.

Скажите, пожалуйста, верно ли я понимаю, что пользователь не сможет менять состояние объекта, но, при этом, состояние объекта сможет меняться через библиотеку, поскольку изначальный объект является изменяемым? Не нарушается ли в этом случае какое-нибудь правило стандарта? Может ли компилятор решить, что объект, на который указывает указатель на неизменяемое значение, не менялся?


Ответы (1 шт):

Автор решения: Croessmah

С помощью const_cast пользователь может получить указатель на объект без квалификатора const и поменять объект. При этом не будет неопределенного поведения, т.к. объект изначально не объявлен константным.

Object * p = const_cast<Object*>(get_object());
//Законно изменяем объект через p

Вопрос в том, насколько вы сами хотите защищать этот объект от изменения. Зачастую, возврата указателя на константный объект вполне достаточно.

→ Ссылка