隐式转换序列排序[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
,所以可以看出后两者是重定义。它无法在第一个示例中说明,编译器不会发现使用一组参数调用该函数是否会导致歧义,直到您调用它。
考虑以下函数:
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
,所以可以看出后两者是重定义。它无法在第一个示例中说明,编译器不会发现使用一组参数调用该函数是否会导致歧义,直到您调用它。