为什么函数重载只能针对参数类型和个数,而不针对返回值?该怎么处理
为什么函数重载只能针对参数类型和个数,而不针对返回值?
C++的函数名,name mangling为什么不能对返回值做?
针对返回值进行重载不会有歧义么?
有人说,难以确定类型。可是针对参数类型重载也是提供多个类型给用户实现和选择啊。
------解决方案--------------------
函数的两个要素:参数与返回值。
如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。
如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如:
void Function(void);
int Function (void);
上述两个函数,第一个没有返回值,第二个的返回值是int 类型。如果这样调用函数:
int x = Function ();
则可以判断出Function 是第二个函数。问题是在C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个Function 函数被调用。
所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。
------解决方案--------------------
举个极端的例子:
fun(2);//函数的调用可以不使用它的返回值,你叫C++怎么根据返回值推导?
------解决方案--------------------
因为函数返回值并不构成函数重载的可分辨的特征,当进行函数调用时,无法从函数的返回值解析应该调用哪个函数。
------解决方案--------------------
举个例子吧,如果返回值一个是基类类型指针,一个是派生类类型的指针,但是程序用基类类型的指针保存函数的返回值。那么你怎么选择呢?
------解决方案--------------------
编译器根据参数个数及类型定义符号表…然后进行语义分析匹配…当然如果你需要根据返回值匹配…那么你只需要定义一个编译规则来进行匹配即可!人家定义的东西…不要问为什么!语法上的哪有那么多为什么…
------解决方案--------------------
楼主各位都把原因回答了, 理解后就这么记就可以了
------解决方案--------------------
任何表达式都有返回值,但返回值不一定被使用
要用返回值做函数重载的判定标准,就等于强制使用该函数的人使用返回值。
------解决方案--------------------
而且要判定返回值的特定类型,就将和类型转换(显式和隐式)概念冲突
你用整型变量接受一个返回逻辑变量的函数,会自动做低精度到高精度的类型转换(好吧,C/C++里的逻辑型其实就是整型,但理论上是这样),因为不会有精度损失所以连警告也没有,直接隐式转换
这种时候你要根据返回值类型判定该重载哪个函数,就将面对概念不明确——还是那句话,编程者都没弄清楚的逻辑,编译器更加弄不清楚。
------解决方案--------------------
函数签名似乎没有返回值
C++的函数名,name mangling为什么不能对返回值做?
针对返回值进行重载不会有歧义么?
有人说,难以确定类型。可是针对参数类型重载也是提供多个类型给用户实现和选择啊。
------解决方案--------------------
函数的两个要素:参数与返回值。
如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。
如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如:
void Function(void);
int Function (void);
上述两个函数,第一个没有返回值,第二个的返回值是int 类型。如果这样调用函数:
int x = Function ();
则可以判断出Function 是第二个函数。问题是在C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个Function 函数被调用。
所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。
------解决方案--------------------
举个极端的例子:
fun(2);//函数的调用可以不使用它的返回值,你叫C++怎么根据返回值推导?
------解决方案--------------------
因为函数返回值并不构成函数重载的可分辨的特征,当进行函数调用时,无法从函数的返回值解析应该调用哪个函数。
------解决方案--------------------
举个例子吧,如果返回值一个是基类类型指针,一个是派生类类型的指针,但是程序用基类类型的指针保存函数的返回值。那么你怎么选择呢?
------解决方案--------------------
编译器根据参数个数及类型定义符号表…然后进行语义分析匹配…当然如果你需要根据返回值匹配…那么你只需要定义一个编译规则来进行匹配即可!人家定义的东西…不要问为什么!语法上的哪有那么多为什么…
------解决方案--------------------
楼主各位都把原因回答了, 理解后就这么记就可以了
------解决方案--------------------
任何表达式都有返回值,但返回值不一定被使用
要用返回值做函数重载的判定标准,就等于强制使用该函数的人使用返回值。
------解决方案--------------------
而且要判定返回值的特定类型,就将和类型转换(显式和隐式)概念冲突
你用整型变量接受一个返回逻辑变量的函数,会自动做低精度到高精度的类型转换(好吧,C/C++里的逻辑型其实就是整型,但理论上是这样),因为不会有精度损失所以连警告也没有,直接隐式转换
这种时候你要根据返回值类型判定该重载哪个函数,就将面对概念不明确——还是那句话,编程者都没弄清楚的逻辑,编译器更加弄不清楚。
------解决方案--------------------
函数签名似乎没有返回值