Ja wrzucam dużo constów. Zmniejsza to ilość błędów, które powstają. I to nie jest żadna nadgorliwość, tylko zmniejszenie sobie roboty przy testowaniu.
Ostatnio mam też tendencję do wpisywania const między typ, a nazwę. Dzięki temu przy konstrukcjach typu: <<< typ [const] * [const] nazwa >>>, od razu widzę, co jest stałe, tzn czy sam wskaźnik, czy też/ lub to na co wskazuje.
Na pewno nie szczędziłbym constów przy publicznym API. STL ma zdaje się górę constów w publicznym API. Jeżeli funkcja nie modyfikuje obiektu to daj consta. Dzięki temu będziesz mógł np odpalić length() na stałym obiekcie. Nie-const automatycznie rzutuje się na const, natomiast w drugą stronę już jest kombinowanie i obchodzenie mechanizmów C++ (co może doprowadzić do katastrofy).
http://en.wikipedia.org/wiki/Const-correctness
Zdaje mi się, że głębokie consty i immutable w D mają znacznie więcej sensu niż płytkie consty z C/C++.
Jeszcze jedna sprawa:
int const lokalnaStała = 5;
if (lokalnaStała = 6) cośtam;
nie skompiluje się, natomiast:
int lokalnaNibyStała = 5;
if (lokalnaNibyStała = 6) cośtam;
skompiluje się i program będzie zawierał błąd.