请考虑以下代码段:
template<class T>
std::enable_if_t<std::is_integral<T>::value, bool> func(T value) {
std::cout << "T\n";
return func(static_cast<int64_t>(value));
}
bool func(int64_t value) {
std::cout << "int64_t\n";
return true;
}
int main() {
func(1);
}
它导致无限递归。但是,交换这两个函数的定义顺序(如果bool func(int64_t value)
在模板一之前定义)有助于避免此问题。
那是为什么?函数重载的顺序重要吗?
答案 0 :(得分:2)
当编译器解析第一个函数(模板)时,它对func
的第二个重载一无所知。解析是从源文件的顶部到底部完成的。
这就是使用符号之前需要声明符号的原因。这也意味着仅在顶部使用bool func(int64_t);
的声明即可解决您的问题。
答案 1 :(得分:1)
函数重载的顺序重要吗?
从某种意义上说,重载的顺序很重要,如果在声明潜在的重载之前调用重载集,则尚未声明的函数将不参与重载解析。
在函数调用之前声明的重载顺序无关紧要。