const ist eigentlich nie und an keiner Stelle nötig. Möglicherweise kann der Compiler dank const ein paar Sachen mehr Optimieren, aber darum geht es überhaupt nicht.
const ist einfach dafür da, dem Programmierer zu helfen, sein Programm übersichtlicher und robuster zu gestalten. Im Grunde ist es das selbe wie mit öffentlichen (public) Klassenattributen: Man muss sie nicht benutzen, es hilft aber.
Ein Beispiel: Die std::string Klasse bietet die Funktion c_str() an, die dir einen konstanten C-String liefert. Den kannst du zum lesen benutzen, du darfst ihn aber nicht verändern. Man könnte jetzt auf die Idee kommen, einen std::string über seinen C-String zu manipulieren. Aber möglicherweise ist das, was c_str() dir liefert nur eine Darstellung des Strings. Möglicherweise teilen sich 2 gleiche Strings den selben Speicher und erst wenn du den einen veränderst, bekommt er seinen eigenen Speicher. Über die Zugriffsmethode von std::string kann man das problemlos realisieren, aber die Klasse kann einfach nicht mitbekommen, wenn das, was sie als C-String liefert, verändert wird.
Im Grunde genommen, sagt ein const einfach nur "Wenn du das hier änderst, hat es nicht den Effekt, den du erwartest, also verbiete ich es dir, damit du dir einen vernünftigen Weg suchst, das zu tun, was du wirklich tun willst".
Ein zweiter Effekt ist, dass man die Programmkomplexität verringert, indem man durch const sicherstellt, dass etwas nicht verändert werden kann. Es ist ein bisschen wie mit globalen Variablen: Wenn man etwas von jeder Stelle im Code aus verändern kann, wird das Programm unübersichtlich und schwerer zu debuggen. Mit const hingegen kannst du lesenden Zugriff gewähren (der meiste wesentlich weniger problematisch ist), ohne jedesmal eine Kopie anlegen zu müssen (damit das Original auch ja nicht verändert wird). Deshalb empfiehlt es sich, const überall dort zu benutzen, wo es möglich ist.