为什么编译器无法为此函数引用找出正确的重载?

时间:2013-01-04 02:06:53

标签: c++

为什么不选择合适的过载?我得到了错误:

  

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();

}

3 个答案:

答案 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)

您不能通过返回类型重载;只能通过参数。