众所周知,仅返回类型不同的普通函数不能在 C++ 中重载。
但是这个限制不适用于重载的函数模板,例如:
int f(auto) { return 1; }
auto f(auto) { return 2; }
所有编译器都接受它,演示:https ://gcc.godbolt.org/z/qj73Mzehd
为什么语言对模板做出这样的例外?
如果重载函数的返回类型不同,则可以使用强制转换为预期函数类型来选择其中一个函数。令人惊讶的是,即使返回类型实际上相同,Clang 也允许人们解决歧义,例如:
((int(*)(int))f)(3);
选择
int f(auto) { return 1; }
演示:https ://gcc.godbolt.org/z/snfvbq1ME
Clang在这里错了吗?