这个函数是否重载了函数?
void f(int a, int b) {}
void f(int& a, int& b) {}
void f(int* a, int* b) {}
void f(const int a, const int b) {}
或者只有当参数的数量或类型不同时才会发生重载功能?
答案 0 :(得分:7)
第1,2,3号是。 4号重新宣布1号。
您会发现,顶级const限定符不会影响函数声明。它们改变了在函数定义中使用它们的方式,但它仍然是相同的函数
void f(int);
void f(const int); //redeclares
void f(const int x) //same as above
{
x = 4; //error, x is const
}
另一方面,这很好
void f(const int);
void f(int x) //same as above
{
x = 4; //OK Now
}
请注意,非顶级consts确实参与了重载解析。 E.g。
void f(int & x)
void f(const int & x) //another function, overloading the previous one
最后,你问的是
或仅发生重载功能 当参数的数量或类型 不同?
是的,没错,但int
,int*
和int&
是不同的类型。当然,在1或3的情况下,在大多数情况下,它将是不明确的调用,但在某些情况下,编译器可以告诉您的意思。例如
void f(int);
void f(int&);
f(3)//calls f(int)
int x = 3;
f(x); //ambiguous call;
答案 1 :(得分:3)
虽然第1和第2会引起左值的模糊,但它们会超载。第四是重新定义第一名: