Wie andere haben erklärt, sagt der Norm, es ist ok, und dass der Compiler kann es sich leisten nachsichtig über die Durchsetzung dieser sein, weil sie nicht den Anrufer nicht beeinflusst, aber niemand beantwortet hat, warum der Compiler sollte wählen sein nachsichtig. Es ist im Allgemeinen nicht besonders nachsichtig, und ein Programmierer, der gerade die Schnittstelle betrachtet und dann in die Implementierung eintaucht, kann es im Hinterkopf haben, dass ein Parameter const ist, wenn es nicht ist oder umgekehrt - keine gute Sache.
Diese Kronzeugenregelung ermöglicht Implementierungsänderungen, ohne die Header zu ändern. Durch die Verwendung traditioneller make-Tools wird die Neukompilierung von Clientcode ausgelöst. Dies kann ein ernstes Problem bei der Entwicklung im Enterprise-Bereich sein, wo eine nicht substantielle Änderung in einem Low-Level-Header (zB Logging) den Wiederaufbau von nahezu allen Objekten zwischen ihm und den Anwendungen erzwingen kann, was tausende Stunden CPU-Zeit verschwendet Verzögerung für alle und alles, was auf den Builds wartet.
Also, es ist hässlich, aber eine praktische Konzession.
Ich habe beantwortet auch eine ähnliche Frage, die sich auf, warum eine Überlastung von f (const T) und f (T) ist nicht erlaubt aussieht - dies jemand Lesen zu interessieren könnte - Top-level const doesn't influence a function signature
Bitte schauen zu Zeiger. – alternative
@mathepic: Was hat dieser Code mit Zeigern zu tun? – casablanca
@casablanca Alles - Es scheint, dass er const int und int wie int und int * vermischt. – alternative