Date: 20.03.2018 17:24:57
"что говорит Стандарт по поводу следующей ситуации"
Само по себе, преобразование указателя на переменную из одного типа в другой легально, в любых комбинациях, в том числе удаляя квалификатор const. Это однако не значит, что полученный указатель можно разыменовать и "пользоваться" им (т.е. выполнять операции над указуемым объектом).
- Работать с объектом разрешено только через указатель на его исходный тип, исходный тип с добавлением const/volatile, или на тип char. Все остальное ведет к неопределенному поведению.
- Если объект первоначально объявлен как const, попытка изменить его любым путем приводит к неопределенному поведению. (В частности, компилятору разрешено размещать статические константы в области памяти, доступной только для чтения, так что попытка записи туда приведет к ошибке времени выполнения).
"Мне интересно, указатель на константные данные должен защищать лишь от изменения данных, на которые он указывает"
Да, только от изменения указуемых данных через эту конкретную переменную.
Date: 21.03.2018 5:14:17
В случае динамической памяти да, не приводит. Ограничения, о которых я писал, распространяются только на объекты, объявленные в коде (локальные или глобальные переменные). Для динамически выделенной памяти не имеет смысла понятие "исходный тип данных", соответственно любой указатель легален.
Автор: VadimTagil