按返回类型和参数重载

时间:2014-10-15 15:39:22

标签: c++

有效

int func();
float func(int x);

我知道只有返回类型才能在没有模板的情况下重载,但这是否正确?

5 个答案:

答案 0 :(得分:6)

是的。重载规则是参数需要具有不同的类型和/或数量;当满足时,各种过载的返回类型可以不同。给定实际参数,编译器可以确定要调用的重载。

只有返回类型的重载无效,因为编译器无法根据返回值进行选择;假设你有超载int f()float f(),而你做

(void)f();

在这种情况下,没有人知道你打算打电话给f。 (除非对标准中指定的类型有任意偏好,但是没有,并且很难找到合理的类型。)

答案 1 :(得分:2)

功能由其签名标识。 在C ++函数签名中包含,

  1. 名称
  2. 参数类型
  3. 没有参数
  4. 论证顺序

    返回类型的功能不被视为签名的一部分。 在程序中遇到函数调用时,编译器将查找具有该名称的函数。如果多个函数具有相同的名称(函数重载)。然后编译器将检查上面的签名。如果未找到完全匹配,则编译器将进行一些转换并检查匹配。仍未找到匹配项将显示错误

答案 2 :(得分:0)

是的,这是正确的。函数由

定义
  • 命名空间
  • 功能名称
  • 参数类型

但是,不考虑返回类型。

见这个例子:

int f(); // correct
double f(int x); // correct
void f(double y); // correct, the type is different
char f(int z); // Not correct, same signature than the 2nd function

答案 3 :(得分:0)

你已经得到了一些答案,说明这是可能的,但是另一个问题是它是否可取,而且在这一点上我会建议反对它,因为它给用户带来了负担:他们需要弄清楚输出什么重载以了解函数返回的内容。

请注意,这不是一般说明不可取的声明,在很多情况下,为不同的函数设置不同的返回类型是有意义的,例如sqrtfloat将返回float,如果输入是double,它将产生double,但从语法和调用返回类型是很自然的。

在你提供的人工例子中并非如此,或者至少它并不明显,所以我建议不要重载但产生不同的命名函数。

答案 4 :(得分:-1)

是的,这很好,因为你有两个重载的不同参数。只是为了你的信息,为什么编译器不能仅从重载调用的返回类型推断出来。

有一个名为mangling的概念。编译器修改每个函数的名称,因为它很容易适当地调用它。所以如果函数是,

int foo (int x );

错位的名称将与foo_int一致。在此回归类型中不予考虑。所以,如果我有两个重载,如

int foo (int x );
int foo (char x);

错位的名字会是

foo_int
foo_char

分别。但是,如果您只为重载分辨率选择返回类型,则它将失败,因为在名称重整中不考虑返回类型。