Возможный дубликат:
Функции с аргументами const и перегрузкой
Меня довольно путают правила перегрузки и объявления const. Вот две вещи, которые меня озадачивают, может быть, вы можете помочь мне найти более глубокое недоразумение в моей голове, что приводит к тому, что они озадачивают меня.;)
Первый выпуск:
Мой компилятор позволяет это:
void f(int & x) {
std::cout << "plain f" << std::endl;
}
void f(const int & x) {
std::cout << "const f" << std::endl;
}
Но следующее приводит к ошибке компиляции (функция уже имеет тело):
void f(int x) {
std::cout << "plain f" << std::endl;
}
void f(const int x) {
std::cout << "const f" << std::endl;
}
Я думаю, что это имеет смысл, потому что я думал, что const был только там, чтобы сообщить компилятору, что передаваемый объект не изменяется, а во втором случае он все равно копируется. Но если это правильно, то почему я могу перегружать функции, используя const?
Другими словами, почему, если я использую компиляционную версию и вызываю такие функции, как это:
int x1 = 5;
const int x2 = 5;
f(x1);
f(x2);
Я получаю "plain f" и "const f" вместо "const f" дважды? По-видимому, теперь я также использую const, чтобы сообщить компилятору, что функция вызывает не только то, что ссылка не изменяется. Это становится более запутанным, потому что, если я удалю "обычную" версию, она будет работать нормально и дважды вызовет версию "const".
Теперь, каков мой реальный вопрос? Я хотел бы знать, каковы идеи, лежащие в основе этого поведения, потому что в противном случае его запоминание очень сложно.