考虑以下功能
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
而另一个不是?
除此之外,两个功能在参数的数量和类型方面是相同的。
答案 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
版本。
答案 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)
这仅在编译时完成,因为参数类型不同。 因此,这些不是简单的重载函数,其调用只能在编译时确定。