Как уже объяснили другие, Стандарт говорит, что все в порядке, и что компилятор может позволить себе проявлять снисходительность в отношении принудительного применения этого, потому что это не влияет на вызывающую сторону, но никто не ответил, почему компилятор следует выбрать, чтобы быть снисходительным. В целом это не особенно снисходительно, и программист, который только что посмотрел на интерфейс, а затем погружается в реализацию, может вспомнить, что параметр является константным, когда он не равен или наоборот - не очень хорошая вещь.
Это снисходительность позволяет вносить изменения в реализацию без изменения заголовков, что при использовании традиционных инструментов make вызывает перекомпиляцию клиентского кода. Это может быть серьезной проблемой при разработке масштаба предприятия, когда несущественные изменения в низкоуровневом заголовке (например, ведение журнала) могут привести к перестройке практически всех объектов между ним и приложениями ... тратить тысячи часов процессорного времени и задержка всех и всего, ожидающего сборки.
Итак, это некрасиво, но практическая уступка.
Я также ответил на другой похожий вопрос, в котором рассматривается, почему перегрузка f (const T) и f (T) недопустима - может представлять интерес для любого, кто читает это - const верхнего уровня не делает t влияет на сигнатуру функции