在const和非const引用变量的情况下,何时决定调用哪个函数?

时间:2015-07-21 08:41:07

标签: c++ binding overloading dynamic-binding static-binding

考虑以下功能

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而另一个不是?

除此之外,两个功能在参数的数量和类型方面是相同的。

3 个答案:

答案 0 :(得分:1)

将在编译时选择重载。 &#34;最合适的&#34;将被选择,在这种情况下取​​决于函数参数的cv限定:

来自N4140 [over.ics.rank] / 3

  

相同形式的两个隐式转换序列是不可区分的转换序列,除非其中之一   以下规则适用:

     
      
  • 标准转换序列S1是比S2更好的转换序列

         
        
    • ...

    •   
    • S1和S2是引用绑定,引用引用的类型相同   除了顶级cv限定符之外的类型,以及由S2初始化的引用所引用的类型   比由S1初始化的引用所引用的类型更符合cv。

    •   
  •   

int&的{​​cv}资格低于const int&,因此将尽可能选择。 int&无法绑定到3之类的右值,因此会选择const版本。

Demo

答案 1 :(得分: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

答案 2 :(得分:0)

这仅在编译时完成,因为参数类型不同。 因此,这些不是简单的重载函数,其调用只能在编译时确定。