Отказ от ответственности: я знаю, что есть два вопроса о полезности const-correctness, однако ни один из них не обсуждал, как в С++ необходима const-правильность, в отличие от других языков программирования. Кроме того, меня не устраивают ответы на эти вопросы.
Теперь я использовал несколько языков программирования, и одна вещь, которая меня пугает на С++, - это понятие const-correctness. В Java, С#, Python, Ruby, Visual Basic и т.д. Такого понятия нет, это очень специфично для С++.
Прежде чем ссылаться на С++ FAQ Lite, я прочитал его, и это меня не убеждает. Совершенно надежные, надежные программы пишутся на Python все время, и нет ключевого слова const или его эквивалента. В Java и С# объекты могут быть объявлены final (или const), но нет функций-констант или параметров функции const. Если функции не нужно изменять объект, он может использовать интерфейс, который обеспечивает доступ только для чтения к объекту. Этот метод можно использовать в С++. На двух реальных С++-системах, над которыми я работал, было очень мало пользы от const, и все работало нормально. Таким образом, я далек от продажи на полезности позволить const заражать кодовую базу.
Мне интересно, что это на С++, что делает const необходимым, в отличие от других языков программирования.
До сих пор я видел только один случай, когда const должен использоваться:
#include <iostream>
struct Vector2 {
int X;
int Y;
};
void display(/* const */ Vector2& vect) {
std::cout << vect.X << " " << vect.Y << std::endl;
}
int main() {
display(Vector2());
}
Компиляция этого с комментариями const компиляцией принимается Visual Studio, но с предупреждением C4239 используется нестандартное расширение. Итак, если вам нужна синтаксическая краткость прохождения во временных рядах, избегая копий и сохраняя стандартную совместимость, вы должны пройти по ссылке const, никоим образом не обойдя ее. Тем не менее, это больше похоже на причуду, чем фундаментальная причина.
В противном случае не существует ситуации, когда необходимо использовать константу, за исключением случаев взаимодействия с другим кодом, который использует const. Констанс мне кажется немного больше, чем самодовольная чума, распространяющаяся на все, что касается:
Причина, по которой const работает на С++, потому что вы можете отбросить его. если ты не мог отбросить его, тогда ваш мир сосать. Если вы объявите метод который принимает const Bla, вы можете пройти это неконстантная Бла. Но если это иначе вы не можете. если ты объявить метод, который принимает не-const Bla, вы не можете передать его const Bla. Так что теперь ты застрял. Так что вы постепенно требуется версия const все, что не const, и вы в конечном итоге с теневым миром. В С++ вы уйти с ним, потому что как с все на С++ это чисто необязательно хотите ли вы эту проверку или нет. Вы можете просто ударить сотню если вам это не нравится.
Андерс Хейлсберг (архитектор С#), Варианты дизайна CLR