为什么不选择合适的过载?我得到了错误:
main.cpp:4:7: error: new declaration ‘int f()’
main.cpp:3:6: error: ambiguates old declaration ‘void f()’
void f() {}
int f() { return 0; }
int main() {
void (&x)() = f;
x();
}
答案 0 :(得分:4)
根据C ++标准,13.2.1
如果两个函数声明属于同一作用域且具有等效的参数声明,则它们引用相同的函数。
这意味着只考虑名称和参数类型;返回类型不是。
这是有道理的,因为您可以使用返回值调用函数,并忽略其返回值。如果语言设计者允许在返回类型上重载,编译器将无法在某些合法的上下文中解决这些重载。
答案 1 :(得分:2)
您不能按返回类型重载,因为:
int main() {
f(); // call to void f
f(); // call to int returning one
f(); // call to void
return 0;
}
都是暧昧的。
float f() { return 0.0f; }
char f() { return 'a'; }
int i = f();
也含糊不清。
答案 2 :(得分:1)
您不能通过返回类型重载;只能通过参数。