对于类方法,this
部分被视为好像它是一个额外的参数。所以如果你做了CString
一个常量,使重载集:
Comparison(const TestBed&, CString const&) // (1)
Comparison(TestBed&, std::string const&) // (2)
For (1)
,我们需要进行两次转换:const
转换,以及转换为CString
。但对于(2)
,我们只需要进行一次转换:std::string
. Thus, (2)
是优选的。
我们可以通过添加第三个函数来验证这一点,该函数执行一次转换this
:
Comparison(const TestBed&, const char*) // (3)
在这里,我们再次只有一个转换(在“第一个”参数中),因此重载集是不明确的。
在[over.match.funcs]中:
成员函数被认为有一个额外的参数,称为隐式对象参数,它
表示已调用其成员函数的对象。出于重载决策的目的,静态和非静态成员函数都具有隐式对象参数,但构造函数没有。
对于非静态成员函数,隐式对象参数的类型为
— “对 cv X 的左值引用”对于没有引用限定符或使用 & 引用限定符声明的函数
— 对于使用 && 引用限定符声明的函数,“对 cv X 的右值引用”
其中 X 是该函数所属的类,cv 是该成员的 cv 限定
函数声明。 [ 示例:对于 X 类的 const 成员函数,假定额外参数为
具有类型“对 const X 的引用”。 —结束示例]
在重载解析期间,隐含的对象参数与其他参数无法区分。
这确立了我们考虑的原因const TestBed&
vs TestBed&
。然后只需比较重载之间的转换序列即可(1)
and (2)
。对于第二个参数,两个转换序列是相等的,但对于第一个参数,(2)
具有更好的转换序列(即精确) - 这就是它毫无歧义地获胜的原因。