隐式转换序列排序[f(int) and f(const int&)]

Ranking of implicit conversion sequences [f(int) and f(const int&)]

考虑以下函数:

void f(int) {...}
void f(const int&) {...}

它们是不同的,它们的定义编译成功。但是,当它们都参与过载决议时,有没有办法调用它们中的任何一个? 如果没有办法,为什么他们不像这两个那样被认为是相同的功能:

void g(int) {...}
void g(const int) {...} // error: redefinition of 'void g(int)'

如果您想显式调用重载集的特定函数,您可以将该函数转换为具有您想要的签名的函数指针。那看起来像

void f(int) { std::cout << "void f(int) \n"; }
void f(const int&) { std::cout << "void f(const int&)\n"; }

int main () 
{
    auto fi = static_cast<void(*)(int)>(f);
    auto fciref = static_cast<void(*)(const int&)>(f);
    fi(2);
    fciref(2);
}

输出

void f(int) 
void f(const int&)

否则你不能调用你的函数,因为根据平局规则,没有一个比另一个更好。

编译器自动去掉top-level const,所以可以看出后两者是重定义。它无法在第一个示例中说明,编译器不会发现使用一组参数调用该函数是否会导致歧义,直到您调用它。