如果需要任何用户定义的转换来匹配参数,则在计算最佳匹配时不会使用标准转换。即使多个候选函数需要用户定义的转换也是如此;在这种情况下,这些函数被认为是相等的。例如:
// argument_matching2.cpp
// C2668 expected
class UDC1
{
public:
UDC1( int ); // User-defined conversion from int.
};
class UDC2
{
public:
UDC2( long ); // User-defined conversion from long.
};
void Func( UDC1 );
void Func( UDC2 );
int main()
{
Func( 1 );
}
Func 的两个版本都需要用户定义的转换以将类型 int 转换为类类型参数。可能的转换包括:
- 从 int 类型转换到 UDC1 类型(用户定义的转换)。
-
从 int 类型转换到 long 类型;然后转换为 UDC2 类型(一个两步转换)。
即使其中的第二个转换需要标准转换以及用户定义的转换,这两个转换仍被视为相等。
注意
用户定义的转换被认为是通过构造函数的转换或通过初始化的转换(转换函数)。在考虑最佳匹配时,两个方法被认为是相等的。
参数匹配和 this 指针
处理类成员函数的方式各不相同,具体取决于它们是否已被声明为 static。由于非静态函数具有提供 this 指针的隐式参数,因此将非静态函数视为比静态函数多一个参数;否则,将以相同的方式声明这些函数。
这些非静态成员函数要求隐含的 this 指针与通过其调用函数的对象类型匹配,或者对于重载运算符,它们要求第一个参数与该运算符应用于的对象匹配。与重载函数中的其他参数不同,当尝试匹配 this 指针参数时,不会引入临时对象,且不会尝试转换。
当 – > 成员选择运算符用于访问成员函数时,this 指针参数具有 class-name* const 的类型。如果将成员声明为 const 或 volatile,则类型分别为 const class-name* const 和 volatile class-name * const。
. 成员选择运算符以相同的方式工作,只不过隐式 & (address-of) 运算符将成为对象名称的前缀。下面的示例演示了此工作原理:// Expression encountered in code obj.name // How the compiler treats it (&obj)->name










