[問題] 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