LINUX.ORG.RU

История изменений

Исправление byko3y, (текущая версия) :

как я могу быть уверенным, что логический const у меня действительно всегда const, а не только по будним дням кроме четверга?

Никак. Точно так же, как ты не можешь быть уверен, что оператор + действительно складывает, а не умножает или даже форматирует диск. Что характерно - это применимо к любому языку

Однако, другие языки не пытаются делать вид, что подобные гарантии предоставляют. Это общая проблема всего C++ — он представляют собой смешную пародию на ООП, на самом деле оставаясь всё тем же Си. Всё, что я хотел сказать «пространными рассуждениями» — это что концепция const в крестах так же не состоятельна, как в Си, причем, по аналогичным причинам. Модификатор const — это очень старая штука, она была еще в K&R «The C Programming Language» (1978) p.40. Зачем СтраусТруп притащил это говно себе в язык — это вопрос риторический, ответа мы скорее всего никогда не узнаем. Впрочем, может быть сам Страуструп этого ответа не знает.

И получить UB, если переменная действительно const

Разве C++ не создан для «UB-driven development»? Ты сам же написал рецепт для UB (модифицировать объект в const методе), а теперь отвечаешь мне «но ты получишь UB». Да, об этом я и пишу, и потому это отвратительный антипаттерн, который популярен среди крестовиков.

Всё просто — этот класс не является константным.

Класс, вероятно, не является, а вот метод вполне может. И это удобно, в том числе, при чтении кода. Не все, как ты, видя const начинают страдать

/*const */MyClass a;

И вся проблема решена. А ты не ответил, что же делать с дублированием кода при написании константных методов. Проблема тут в том, что система типов C++ недостаточно мощная для полноценной поддержки константности, но зачатки фичи оставили, и теперь она требует кучи ручной работы для того, чтобы исправить тупость компилятора. В частности, для полноценной константности нужен вывод типа по результату функции, что, очевидно, в крестах отсутствует.

и есть куча ситуаций, когда придется эту двойную константность мучительно убирать, а потом мучительно возвращать обратно.

Не помню таких сложностей из времён, когда ещё активно писал на плюсах. Возможно ты что-то делаешь не так

М-м-м... ты модифицировал константные объекты? Сорян, я не настоящий крестовик, потому не знаком с «элегантными решениями» сей проблемы.

Исходная версия byko3y, :

как я могу быть уверенным, что логический const у меня действительно всегда const, а не только по будним дням кроме четверга?

Никак. Точно так же, как ты не можешь быть уверен, что оператор + действительно складывает, а не умножает или даже форматирует диск. Что характерно - это применимо к любому языку

Однако, другие языки не пытаются делать вид, что подобные гарантии предоставляют. Это общая проблема всего C++ — он представляют собой смешную пародию на ООП, на самом деле оставаясь всё тем же Си. Всё, что я хотел сказать «пространными рассуждениями» — это что концепция const в крестах так же не состоятельна, как в Си, причем, по аналогичным причинам. Модификатор const — это очень старая штука, она была еще в K&R «The C Programming Language» (1978) p.40. Зачем СтраусТруп притащил это говно себе в язык — это вопрос риторический, ответа мы скорее всего никогда не узнаем. Впрочем, может быть сам Страуструп этого ответа не знает.

И получить UB, если переменная действительно const

Разве C++ не создан для «UB-driven development»? Ты сам же написал рецепт для UB (модифицировать объект в const методе), а теперь отвечаешь мне «но ты получишь UB». Да, об этом я и пишу, и потому это отвратительный антипаттерн, который популярен среди крестовиков.

Класс, вероятно, не является, а вот метод вполне может. И это удобно, в том числе, при чтении кода. Не все, как ты, видя const начинают страдать

/*const */MyClass a;

И вся проблема решена. А ты не ответил, что же делать с дублированием кода при написании константных методов. Проблема тут в том, что система типов C++ недостаточно мощная для полноценной поддержки константности, но зачатки фичи оставили, и теперь она требует кучи ручной работы для того, чтобы исправить тупость компилятора. В частности, для полноценной константности нужен вывод типа по результату функции, что, очевидно, в крестах отсутствует.

и есть куча ситуаций, когда придется эту двойную константность мучительно убирать, а потом мучительно возвращать обратно.

Не помню таких сложностей из времён, когда ещё активно писал на плюсах. Возможно ты что-то делаешь не так

М-м-м... ты модифицировал константные объекты? Сорян, я не настоящий крестовик, потому не знаком с «элегантными решениями» сей проблемы.