Вы можете перегружать const
-несс, но только там, где это действительно имеет значение. Что я имею в виду "на самом деле имеет значение"? Хорошо, если вы объявите
void foo(char *ptr);
void foo(const char *ptr);
значение const
имеет значение: вы говорите, что одна перегрузка foo
гарантирует, что не изменится память, которая ptr
указывает на , а другая - нет. Но если вы объявите
void foo(int x);
void foo(const int x);
const
не имеет значения : скалярные аргументы всегда передаются по значению, поэтому ни одна гипотетическая вариация foo
не может изменить значение x
в вызывающей программе, даже если это необходимо к. Поэтому стандарт C ++ говорит, что const
отбрасывается, и это два разных объявления одной и той же функции , одно из которых ошибочное.
Положение const
относительно *
имеет значение. Указатель сам по себе является скаляром, поэтому это также два объявления одной и той же функции:
void foo(char *ptr);
void foo(char *const ptr);
потому что здесь const
определяет сам указатель, а не объект, на который он указывает.
Это подводит нас к методам: квалификатор const
после списка аргументов в объявлении метода применяется к объекту, указанному this
, и может быть перегружен:
struct A
{
int foo (char *ptr);
int foo (char *ptr) const;
int foo (const char *ptr);
int foo (const char *ptr) const;
};
Вы должны думать, что эти декларации переписаны внутри:
struct A {};
int A_foo (A *this, char *ptr);
int A_foo (const A *this, char *ptr);
int A_foo (A *this, const char *ptr);
int A_foo (const A *this, const char *ptr);
и тогда все работает в соответствии с обычными правилами для перегруженных функций.