我有一个关于 c++ 函数匹配类型参数T和const T&. 假设我有以下两个功能:
void f(int i) {}
void f(const int &ri) {}
如果我f用类型的参数调用,const int那么这个调用当然是模棱两可的。但是为什么f带有类型参数的调用int也是模棱两可的呢?不会是第一个版本f的完全匹配,而第二个版本的匹配更差,因为int参数必须转换为const int?
const int ci = 0;
int i = 0;
f(ci); // of course ambiguous
f(i); // why also ambiguous?
我知道这种重载没有多大意义,因为调用 off几乎总是模棱两可的,除非参数类型 T 没有可访问的复制构造函数。但我只是在研究函数匹配的规则。
问候,凯文
编辑:为了让我的问题更清楚。如果我有两个功能:
void f(int *pi) {}
void f(const int *pi) {}
那么下面的调用就没有歧义了:
int i = 0;
f(&i); // not ambiguous, first version f(int*) chosen
尽管选择了第一个版本的两个版本f都可以调用&i,因为第二个版本f将包含一个转换,const.也就是说,第一个版本是“更好的匹配”。但是在这两个函数中:
void f(int i) {} and
void f(const int &ri) {}
由于某种原因,这种额外的转换const似乎被忽略了。同样,这两个版本f都可以用int. 但同样,第二个版本f需要进行转换,const这将使其比第一个版本更差f(int).
int i = 1;
// f(int) requires no conversion
// f(const int &) does require a const conversion
// so why are both versions treated as "equally good" matches?
// isnt this analogous to the f(int*) and f(const int*) example?
f(i); // why ambiguous this time?
