开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
G++
问题(Question):
C++ function overloading 的一些问题
根据C++ Primer 5e 6.6.1, function matching 共分为5级
1.exact match, include a top-level const is added or discarded
e.g. void f(int n) {}
int a = 0;
f(a);
///////////////////////////////
void f(const int n) {}
int a = 0;
f(a);
///////////////////////////////
void f(int n) {}
const int a = 0;
f(a);
2.match through a const conversion
e.g. void f(const int &n) {}
int a = 0;
f(a);
///////////////////////////////
void f(const int *pn) {}
int a = 0;
int *pa = &a;
f(pa);
3.match through a promotion
e.g. void f(int n) {}
short a = 0;
f(a);
4.match through a build-in type or pointer conversion
e.g. void f(double dn) {}
int a = 0;
f(a);
///////////////////////////////
void f(void *p) {}
int a = 0;
int *pa = &a;
f(pa);
5.match through a class-type conversion
e.g. void f(Base n) {}
Derived a;
f(a);
///////////////////////////////
void f(int n) {}
Integer a(0);
f(a); // suppose 'Integer' has 'operator int() const;'
各层级例子是我自己举的,可能理解有错误...
回到overload
当多个函数viable且有多个函数同时在最高的层级就会产生ambiguous call
所以以下code让我很疑惑
///////////////////////////////////////
void f(const int &n) {} // f1
void f(int n) {} // f2
int main() {
int a = 0;
f(a) // error:ambiguous, but f1 is level 2, f2 is level 1.
}
///////////////////////////////////////
把f2 加个reference就不会ambiguous
///////////////////////////////////////
void f(const int &n) {} // f1
void f(int &n) {} // f2
int main() {
int a = 0;
f(a) // ok:call f2, f1 is level 2, f2 is level 1.
}
///////////////////////////////////////
pointer版本的也不会ambiguous
///////////////////////////////////////
void f(const int *n) {} // f1
void f(int *n) {} // f2
int main() {
int a = 0;
int *pa = &a
f(pa) // ok call f2, f1 is level 2, f2 is level 1.
}
///////////////////////////////////////
所以第一段code为什么会ambiguous?