有效
int func();
float func(int x);
我知道只有返回类型才能在没有模板的情况下重载,但这是否正确?
答案 0 :(得分:6)
是的。重载规则是参数需要具有不同的类型和/或数量;当满足时,各种过载的返回类型可以不同。给定实际参数,编译器可以确定要调用的重载。
只有返回类型的重载无效,因为编译器无法根据返回值进行选择;假设你有超载int f()
和float f()
,而你做
(void)f();
在这种情况下,没有人知道你打算打电话给f
。 (除非对标准中指定的类型有任意偏好,但是没有,并且很难找到合理的类型。)
答案 1 :(得分:2)
功能由其签名标识。 在C ++函数签名中包含,
论证顺序
返回类型的功能不被视为签名的一部分。 在程序中遇到函数调用时,编译器将查找具有该名称的函数。如果多个函数具有相同的名称(函数重载)。然后编译器将检查上面的签名。如果未找到完全匹配,则编译器将进行一些转换并检查匹配。仍未找到匹配项将显示错误
答案 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)
你已经得到了一些答案,说明这是可能的,但是另一个问题是它是否可取,而且在这一点上我会建议反对它,因为它给用户带来了负担:他们需要弄清楚输出什么重载以了解函数返回的内容。
请注意,这不是一般说明不可取的声明,在很多情况下,为不同的函数设置不同的返回类型是有意义的,例如sqrt
取float
将返回float
,如果输入是double
,它将产生double
,但从语法和调用返回类型是很自然的。
在你提供的人工例子中并非如此,或者至少它并不明显,所以我建议不要重载但产生不同的命名函数。
答案 4 :(得分:-1)
是的,这很好,因为你有两个重载的不同参数。只是为了你的信息,为什么编译器不能仅从重载调用的返回类型推断出来。
有一个名为mangling的概念。编译器修改每个函数的名称,因为它很容易适当地调用它。所以如果函数是,
int foo (int x );
错位的名称将与foo_int一致。在此回归类型中不予考虑。所以,如果我有两个重载,如
int foo (int x );
int foo (char x);
错位的名字会是
foo_int
foo_char
分别。但是,如果您只为重载分辨率选择返回类型,则它将失败,因为在名称重整中不考虑返回类型。