Ответ 1
Квалификатор const
функции члена класса указывает, что эта функция-член (например, foo::operator() const
) не может изменять состояние объекта с точки зрения клиента (т.е. это абстрактное состояние). Это не совсем то же самое, что сказать, что исходные биты объекта не будут меняться.
Запрещается компиляторам С++ рассматривать объекты как необработанные биты, если они не могут решить проблему проблему сглаживания. что в вашем случае компилятор не может. Это связано с тем, что существует непостоянный псевдоним (т.е. std::string &str
), и, следовательно, состояние объекта может быть изменено.
То есть вызов operator()
объекта a
не изменяет состояние a
(т.е. хотя ext
изменился, str
по-прежнему остается псевдонимом ext
).
Это также объясняет, почему указание на объект с указателем на константу (т.е. std::string * const str
) не гарантирует, что объект не будет изменен. Это гарантирует только то, что объект не изменится с помощью этого указателя.