Во-первых, вы пообещали компилятору, но не другим пользователям класса, что вы не будете редактировать переменную.
Во втором примере вы пообещали другим пользователям класса, что не будете редактировать их переменную, но не смогли выполнить это обещание.
Я должен также отметить, что между
есть четкая разница
bar* const variable
и
const bar* variable
и
const bar* const variable
В первой форме указатель никогда не изменится, но вы можете редактировать объект, на который указывает указатель. Во второй форме вы можете редактировать указатель (указывать на другой объект), но не указывать переменную, на которую он указывает. В окончательной форме вы не будете редактировать ни указатель, ни объект, на который он указывает. Ссылка
Чтобы добавить немного уточнения к поставленному вопросу, вы всегда можете пообещать БОЛЬШЕ const, чем меньше. Учитывая класс:
class Foo {
void func1 (int x);
void func2 (int *x);
}
Вы можете скомпилировать следующую реализацию:
Foo::func1(const int x) {}
Foo::func2(const int *x) {}
или
Foo::func1(const int x) {}
Foo::func2(const int* const x) {}
без проблем. Вы сказали своим пользователям, что вы можете редактировать их переменные. В своей реализации вы сказали компилятору, что эта конкретная реализация не будет редактировать эти переменные, даже если вы сказали пользователям, что вы можете. Вы не нарушили обещание для пользователя, и поэтому код компилируется.