2016-05-22 7 views
1

У меня есть две перегруженные функции, один «вызов по значению», а другой «вызов по ссылке».Как перевести функцию «вызов по значению» и «вызов по ссылке»?

int f (int a) 
{ 
    //code 
} 

int f (int &a) 
{ 
    //code 
} 

Но если я прохожу const int, она вызывает функцию «передать по значению», то почему?

const int a=3; 
f(a);//calls the call by value function.Why? 

ответ

7

Поскольку a является const int, и так, что говорит компилятору, что вы не хотите, чтобы изменить a. a не может быть передан по ссылке (только на const&), потому что, если это ссылка, f может его изменить, но f не разрешен, потому что a is const.

Таким образом, единственной допустимой перегрузкой является пропуск по значению один - int f(int a).

+0

Итак, вы хотите сказать, что у нас нет такого типа перегрузки? –

+1

@ ZeeshanAkhter Я имею в виду, что ваш 'a' никогда не может быть вызван функцией« pass by reference » – Rakete1111

+0

У вас может быть один,' a' никогда не будет использоваться для его вызова – Rakete1111

4

lvalue типа const int не может быть преобразован в lvalue типа int (поскольку это отбрасывает квалификацию). Таким образом, перегрузка int& нежизнеспособна, а перегрузка int выигрывает по умолчанию. Аргумент функции все претерпевает преобразование lvalue-to-rvalue, и результат привязан к параметру функции.

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