2012-04-12 2 views
5

Я хотел бы знать, почему эти заявления не будут работать (не совместимы)ambigious функции в C++

void f(int); //p1 
void f(const int);//p2 
void f(int &);//p3 
void f(const int &);//p4 

Если я хорошо понял, что компилятор не будет найти разницу между (ИНТ &) и (const int &) , и если я напишу f (12), он не сможет выбрать между двумя первых объявлениями. Я прав?

ответ

7

p3 и p4 являются абсолютно однозначными и различимыми, p1 и p2 - нет. (И, конечно, p1/p2 отличны от p3 и p4.)

Причина в том, что верхний уровень const по параметру значения не обнаруживается и бесполезен в объявлении. Например, вы можете сделать следующее:

void foo(int x); // declaration 
// ... 
void foo(const int x){ 
    // definition/implementation 
} 

const здесь является деталью реализации, что не важно для вызывающего абонента, так как вы делаете копию в любом случае. Эта копия также является причиной того, что она не отличается от int, со стороны абонентов это точно так же.

Обратите внимание, что const int& r не имеет верхнего уровня const, это ссылка, которая ссылается на постоянное целое число (ссылки всегда постоянны). Для указателей, которые могут быть изменены, если не объявлены const, см. Также this question, где положить const.

Смежные вопросы