[问题] overload 和 function matching 的问题

楼主: s06i06 (三条鱼)   2019-01-18 00:16:35
开发平台(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?
作者: AstralBrain   2019-01-18 03:08:00
我不知道书里面怎么写的, 不过c++标准是说只分三级https://i.imgur.com/dbcIwcJ.pngQualification Conv.和Identity都是Exact Match所以你的第一个code会ambiguous后面两个不会是因为同Rank还有其他规则细分
作者: bibo9901 (function(){})()   2019-01-19 07:21:00
C++跟本没有东西是简单的 ...
作者: Jockey66666 (往事已成追忆)   2019-01-19 09:11:00
有阿 放弃很简单

Links booklink

Contact Us: admin [ a t ] ucptt.com