Что говорят стандарты про изменение состояния не константного объекта и видимость этих изменений через указатель на константу?
Подскажите, пожалуйста, что стандарты языков 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 шт):
С помощью const_cast пользователь может получить указатель на объект без квалификатора const и поменять объект. При этом не будет неопределенного поведения, т.к. объект изначально не объявлен константным.
Object * p = const_cast<Object*>(get_object());
//Законно изменяем объект через p
Вопрос в том, насколько вы сами хотите защищать этот объект от изменения. Зачастую, возврата указателя на константный объект вполне достаточно.