2015-07-21 3 views
-1

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

int f (const int& i) 
{ 
    cout << "in const reference function"; 
} 
int f (int &i) 
{ 
    cout << "in non const reference function"; 
} 
int main() 
{ 
    int i; 
    f(3); 
    f(i); 
} 

В этом случае, когда вызов функции связана с определением функции, это будет во время компиляции или во время выполнения, так как один именующее i, а другой нет?

Кроме этих двух функций, они идентичны по количеству и типу параметров.

+1

«Будет ли это во время компиляции или времени выполнения?» Почему бы вам не попробовать? – juanchopanza

+1

каждая перегрузка (за исключением виртуальных функций) разрешена во время компиляции в C++ – Hcorg

+0

@Hcorg Но перегруженная функция должна отличаться по параметрам? – YakRangi

ответ

1

Перегрузка будет выбрана во время компиляции. «Лучше всего подходит» будет выбраны, который в данном случае зависит от CV-квалификации параметров функции:

От N4140 [over.ics.rank] 3

два последовательностей неявных преобразования/одного и того же вида неразличимы последовательности конверсии, если один из следующие правила не применяется:

  • Стандартная последовательность преобразования S1 является лучше, чем последовательность преобразования S2, если

    • ...

    • S1 и S2 являются ссылочными привязки, а также типы, к которым относятся ссылки являются одинаковыми типа для CV-классификаторов верхнего уровня, за исключением, а также тип, к которому ссылка инициализируется S2 ссылается является более cv-квалифицированным, чем тип, к которому относится ссылка, инициализированная S1.

int& меньше резюме квалифицированных, чем const int&, так что будет выбран, когда это возможно. int& не может связываться с rvalue как 3, поэтому для этого выбрана версия const.

Demo

0

Оно определяется во время компиляции Этот код:

void f (const int& i) 
{ 
    return; 
} 
void f (int &i) 
{ 
    return; 
} 
int main() 
{ 
    int i = 12; 
    f(3); 
    f(i); 
} 

скомпилирован с GCC 5.2 это:

movl $3, -4(%rbp) //Declare variable i with 3 
leaq -4(%rbp), %rax 
movq %rax, %rdi 
call f(int const&) //And call the method with const int& 
leaq -8(%rbp), %rax 
movq %rax, %rdi 
call f(int&) //Call the method with only the reference 
0

Это будет сделано только на время компиляции, потому что тип параметров различен. Следовательно, это не просто перегруженные функции, вызовы которых могут быть определены только во время компиляции.

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