Вызов функции const (или не-const) зависит не от константности параметров, а только от константности вызываемого объекта (в нашем случае obj
).Перегрузка требует другого типа и (неконстантного const) нет, поэтому я не думаю, что вы можете перегрузить, как вы это делаете.(это работает, потому что вы определяете const и неконстантные методы, но это не перегрузка.) Чтобы убедить себя, попробуйте удалить const в конце вашего объявления, чтобы увидеть, разрешено ли вам объявить
int foo(int a);
int foo(const int a);
Вы получите ошибку.
Во втором случае вы думаете, что foo ожидает const int
в качестве аргумента, но нет.const привязан к a
, а не int
.Так что он говорит, что foo ожидает int
, вы можете ссылаться на него, используя a
, и это будет константой: вам не разрешено изменять a
.Вот почему const (для параметра) не отображается в сигнатуре функции (которая будет отличаться для ссылки).
Константа вне функции относится к вызываемому объекту, так что это часть сигнатуры
int foo(int a); # type => int (Test::*)(int)
int foo(const int a) const; # => int (const Test::*)(int)
int foo(const int a) ; # => int (Test::*)(int)
int foo(int a) const; # => int (const Test::*)(int)
(я не уверен на 100% в синтаксисе типа, так что не комментируйте его, это просто идея)
Как вы можете видеть, const
удаляется сa
.Вы также можете написать это int const a
, даже если это не стандартный способ сделать это, это совершенно законно.
Кстати, ваш код никогда не будет делать то, что вы ожидаете, вы должны использовать ссылку наint, чтобы изменить его
int Test::foo(int &a) ...