这个函数重载是否正确?
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;
}
查看工作示例:
编译器必须能够知道调用什么函数。
与
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*)参数化;
您的代码将编译但调用
int iTmp;
a(iTmp);
将产生不明确的重载解析调用,因为两者
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
将匹配。
原因在于标准:
[over.match.best]
A viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2)
int->int
int->int&
这些是标准的转换序列,[over.ics.rank]p3.2
的整个列表被检查但没有成功以获得更好的转换序列(完全匹配 在这两种情况下)
他们因此被视为"undistinguishable"。
忠告:变量也未初始化(如果是自动变量)即使您的代码已编译,输出也将是未定义的。
考虑在一个 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;
}
查看工作示例:
编译器必须能够知道调用什么函数。
与
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*)参数化;
您的代码将编译但调用
int iTmp;
a(iTmp);
将产生不明确的重载解析调用,因为两者
void a(int val)
{
cout<<val;
}
void a(int &val)
{
cout<<val;
}
将匹配。
原因在于标准:
[over.match.best]
A viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2)
int->int
int->int&
这些是标准的转换序列,[over.ics.rank]p3.2
的整个列表被检查但没有成功以获得更好的转换序列(完全匹配 在这两种情况下)
他们因此被视为"undistinguishable"。
忠告:变量也未初始化(如果是自动变量)即使您的代码已编译,输出也将是未定义的。