此函数重载是否正确
Is this function overloading correct?
考虑在一个C++程序中使用这四个函数:
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
void a(int *val)
{
cout<<val;
}
void a(double val)
{
cout<<val;
}
我有几个问题是:
代码中会有任何错误吗?或者它们都过载而没有任何错误。你能告诉我如何正确调用这四个函数吗?我的尝试如下:
int iTmp;
int *pTmp;
double dTmp;
a(iTmp);
a(iTmp);
a(pTmp);
a(dTmp);
唯一的问题是函数:
void a(int &val)
和
void a(int val)
编译器将创建以下错误:
Compilation error time: 0 memory: 3140 signal:0
prog.cpp: In function 'int main()':
prog.cpp:28:8: error: call of overloaded 'a(int&)' is ambiguous
a(iTmp);
^
因为他无法区分两者,所以如果您删除其中一个,编译成功
请参阅示例:
#include <iostream>
using namespace std;
void a(int val)
{
cout<<val;
}
void a(int *val)
{
cout<<val;
}
void a(double val)
{
cout<<val;
}
int main() {
int iTmp = 0;
int *pTmp = 0;
double dTmp = 0.0;
a(iTmp);
a(iTmp);
a(pTmp);
a(dTmp);
return 0;
}
请参阅工作示例:
http://ideone.com/WRZUoW
你的代码将编译,但调用
int iTmp;
a(iTmp);
将产生一个不明确的重载解析调用,因为两者都
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
将匹配。
其原因在于标准:
[过度.匹配.最佳]
如果对于所有参数 i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,则可行函数 F1 被定义为比另一个可行函数 F2 更好的函数
int->int
int->int&
这些是标准转换序列,检查整个[over.ics.rank]p3.2
列表没有成功,以获得更好的转换序列(两种情况下完全匹配)
因此,它们被认为是"无法区分的"。
建议:变量也没有初始化,(如果是自动变量)即使您的代码已编译,输出也将是未定义的。
编译器必须能够知道要调用什么函数。
跟
int i = 12;
a(i);
a(int i)
和 c(int& i)
都是可接受的候选项,编译器会引发错误。
和
void a(const int& i) { ... }
将遭受同样的问题。
函数会导致问题
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
您的呼叫a(iTmp);
有两个可能的候选项。编译器应显示这些错误。否则指针参数(int *val
)和双参数(double val
)都可以。
最明显的问题是
void a(int val) {
和
void a(int& val) {
用 iTmp
调用时不明确。
除此之外,根据变量是全局变量还是局部变量,代码使用未初始化的变量 -> UB 以及是否,
void a(int* val) {
std::cout << val << std::endl;
}
正确超载有待商榷。我假设它应该是std::cout << *val << std::endl;
的,但这当然取决于函数应该做什么(尽管打印地址的函数通常会由(void* 或 char*)参数化);
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- 重载虚拟行为是否定义良好?
- 检查类是否具有可能重载的函数调用运算符
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- 预处理器是否可以更改运算符重载功能的符号?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 在运算符重载中,运算符的左侧是否隐式传递给函数?
- 运算符重载是否真的需要返回值C++?
- 是否使用cv::Point2f类型重载std::排序
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 放置/分段语法是否可能出现懒惰"operator or"重载?
- 如果我为一个类编写new和delete运算符,我是否必须编写它们的所有重载
- 从模板检查成员函数重载是否存在
- CPP 中的 ++ 运算符对字符是否有任何重载?
- 检查类型 T 是否具有成员函数 SFINAE 的任何重载
- 如何在C++编译时检查运算符的特定重载是否存在
- 当取消引用运算符 (*) 重载时,*this 的使用是否受到影响?
- clang 拒绝具有尾随 decltype 返回类型的模板调用是否正确,具体取决于其重载之一?
- 是否重载索引运算符以模拟POD多维数组