TL; DR
Соответствует ли использование ключевого слова const его намерениям?
номер
Мой вопрос заключается в том, соответствует ли использование ключевого слова const
его намерение, с точки зрения пользователя API?
Я не уверен, какова точка зрения пользователя API. На самом деле, такой дизайн, который вы предлагаете, скорее всего, приведет к большему разнообразию пользовательского подхода, чем обычно, потому что предполагаемое предполагаемое поведение не соответствует требованиям языка C.
И будет ли
риски, связанные с точки зрения компилятора, в этом код может
строго говоря, нарушать семантику только для чтения, как указано
ключевое слово const?
Да. В частности,
Если предпринята попытка изменить объект, определенный с
константно-квалифицированный тип посредством использования lvalue с неконстантно-квалифицированным типом
тип, поведение не определено.
( C2011, 6.7.3 / 6 )
Компиляторы могут делать всякие интересные вещи, когда возникает UB. Среди наиболее вероятных можно предположить, что некоторые неопределенные варианты поведения не происходят. Таким образом,
например, при компиляции программы, которая вызывает вашу функцию getCurrentPositionAndVelocity()
, компилятор может предположить, что функция не изменяет члены const
структур, предоставленных ей. Или попытка изменить их может фактически потерпеть неудачу. Или что-нибудь еще, действительно - это то, что означает "неопределенный".
Как пользователь API, что бы вы подумали об этом
подход или у вас есть предложения получше?
Я думаю, мой провайдер API должен приложить все усилия, чтобы обеспечить реализацию, соответствующую языковому стандарту.
Кроме того, мне было бы интересно узнать, от кого, по вашему мнению, вы меня защищаете, сделав членов структуры const
, и почему вы думаете, что вы лучше меня знаете, следует ли изменять элементы структуры. Я также удивляюсь, почему кто-то может подумать, что такая защита была достаточно важной, чтобы оправдать все множество проблем, которые посещают const
членов структуры.
Что касается лучших предложений, как насчет того, чтобы просто не делать членов const
? Это спасет печаль и для вас, и для ваших пользователей.
Относительно редактирования добавление ссылки на Как инициализировать постоянные элементы структур в куче , обсуждаемый здесь случай существенно отличается от случая, рассмотренного здесь, поскольку Стандарт касается. Динамически распределенная память не имеет объявленного типа, но может иметь эффективный тип, основанный на том, что было записано в него и / или как к нему осуществляется доступ. Правила для этого представлены в параграфе 6.5 / 6 стандарта, и вы можете найти обсуждение этого в нескольких ответах в других разделах SO, таких как этот , который вы связали в комментариях .
Суть в том, что объект с выделенным временем жизни получает свой эффективный тип из первых записанных в него данных, и эта первая запись может рассматриваться как его эффективная инициализация (хотя последний термин не используется в стандарте). Последующие манипуляции должны уважать эффективный тип, включая ограничения, возникающие из const
сущности самого типа или его членов, рекурсивно, в соответствии с параграфом 6.5 / 7 , общеизвестным как "правило строгого наложения имен".
Объекты со статическим или автоматическим временем жизни имеют объявленный тип в качестве действующего типа и имеют начальное значение, указанное инициализаторами, если таковые имеются. Они также должны манипулировать в соответствии с их эффективными типами.