我有一个关于 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?