Dlaczego są stałe kwalifikatory w argumentach funkcji używanych do przeciążania rozdzielczości? [duplikować]

Możliwy duplikat:
Funkcje ze stałymi argumentami i przeciążeniem

Jestem dość zdezorientowany regułami przeciążania i deklaracji stałych. Oto dwie rzeczy, które mnie układają. Może pomożesz mi znaleźć głębsze nieporozumienie w mojej głowie, które powoduje, że są dla mnie zagadkowe. ;)

Pierwsza sprawa:

Mój kompilator pozwala na to:

void f(int & x) {
  std::cout << "plain f" << std::endl;
}
void f(const int & x) {
  std::cout << "const f" << std::endl;
}

Ale poniższe powoduje błąd kompilacji (funkcja ma już ciało):

void f(int x) {
  std::cout << "plain f" << std::endl;
}
void f(const int x) {
  std::cout << "const f" << std::endl;
}

Przypuszczam, że ma to sens, ponieważ uważałem, że const służy jedynie do informowania kompilatora, że ​​przekazywany obiekt nie jest zmieniany, aw drugim przypadku jest mimo to kopiowany. Ale jeśli to jest poprawne, to dlaczego mogę przeciążyć funkcje używając const?

Innymi słowy, dlaczego używam wersji kompilującej i wywołuję takie funkcje:

  int x1 = 5;
  const int x2 = 5;
  f(x1);
  f(x2);

mam dwa razy otrzymać „zwykły f” i „const f” zamiast „const f”? Najwyraźniej teraz używam const, aby powiedzieć kompilatorowi, która funkcja ma wywoływać nie tylko to, że odwołanie się nie zmienia. Staje się to coraz bardziej mylące, ponieważ jeśli usunę „zwykłą” wersję, to działa ona dobrze i dwukrotnie wywołuje wersję „const”.

Jakie jest moje aktualne pytanie? Chciałbym wiedzieć, jakie są pomysły tego zachowania, ponieważ inaczej zapamiętanie go jest bardzo trudne.

questionAnswers(2)

yourAnswerToTheQuestion