I would like to know why these declarations won’t work(are not compatible)
void f(int); //p1
void f(const int);//p2
void f(int &);//p3
void f(const int &);//p4
If I understood well, the compiler won’t find a difference between (int &) and (const int &)
and if I write f(12) it won’t be able to choose between the two first declarations..
Am I right?
p3 and p4 are perfectly unambiguous and distinguishable, p1 and p2 are not. (And of course p1/p2 are distinguishable from p3 and p4.)
The reason is that top-level
conston a value parameter is not detectable and infact useless on a declaration. You can for example do the following:The
consthere is an implementation detail that’s not important for the caller, since you make a copy anyways. That copy is also the reason why it’s not distinguishable from justint, from the callers side it’s exactly the same.Note that
const int& rdoes not have a top-levelconst, it’s the reference that refers to a constant integer (references are always constant). For pointers, which may be changed if not declaredconst, see also this question for where to putconst.