在C++中,以下函数声明不能重载。
1)仅在返回类型上不同的函数声明。例如,以下程序编译失败。
#include
int foo() {
return 10;
}
char foo() {
return 'a';
}
int main()
{
char x = foo();
getchar();
return 0;
}
2)如果它们中的任何一个是静态成员函数声明具有相同的名称和名称参数类型列表成员函数声明不能被重载。例如,以下程序编译失败。
#include
class Test {
static void fun(int i) {}
void fun(int i) {}
};
int main()
{
Test t;
getchar();
return 0;
}
3)仅在指针*与数组[]中不同的参数声明是等效的。即,将数组声明调整为指针声明。在参数类型中,只有第二维和后续数组维才有意义。例如,以下两个函数声明是等效的。
int fun(int *ptr);
int fun(int ptr[]); // redeclaration of fun(int *ptr)
4)仅在一个是函数类型而另一个是指向相同函数类型的指针方面不同的参数声明是等效的。
void h(int ());
void h(int (*)()); // redeclaration of h(int())
5)仅在存在和不存在const和/或volatile方面不同的参数声明是等效的。也就是说,在确定要声明,定义或调用哪个函数时,将忽略每种参数类型的const和volatile类型说明符。例如,以下程序在编译时失败,并显示错误“重新定义’int f(int)’”
例子:
#include
#include
using namespace std;
int f ( int x) {
return x+10;
}
int f ( const int x) {
return x+10;
}
int main() {
getchar();
return 0;
}
以这种方式,仅忽略参数类型说明中最外层的const和volatile类型说明符。包含在参数类型规范中的const和volatile类型说明符很重要,可用于区分重载的函数声明。特别是对于任何类型T
“ T的指针”,“ const T的指针”和“ volatile T的指针”被认为是不同的参数类型,“ T的引用”,“ const T的引用”和“ volatile T的引用”也被认为是不同的参数类型。例如,请参阅由Venki发布的此注释中的示例。
6)两个仅在默认参数方面不同的参数声明是等效的。例如,以下程序在编译时失败,并显示错误“重新定义`int f(int,int)’”
#include
#include
using namespace std;
int f ( int x, int y) {
return x+10;
}
int f ( int x, int y = 10) {
return x+y;
}
int main() {
getchar();
return 0;
}
参考:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf