此同一规则适用于指向成员的指针转换。从 T D::* 类型到 T C::* 类型的转换优于从 T D::* 类型到 T B::* 类型的转换等(其中,T 是该成员的类型)。
前面的规则仅沿派生的给定路径应用。考虑下图中显示的关系图。
演示首选转换的多继承关系图
从 C* 类型到 B* 类型的转换优于从 C* 类型到 A* 类型的转换。原因是它们位于同一个路径上,且 B* 更为接近。但是,从 C* 类型到 D* 类型的转换不优于到 A* 类型的转换;没有首选项,因为这些转换遵循不同的路径。
使用用户定义的转换的匹配。此序列不能归类为完全匹配、使用提升的匹配或使用标准转换的匹配。序列必须仅包含用户定义的转换、标准转换或要归类为使用用户定义的转换的匹配的常用转换。使用用户定义的转换的匹配被认为优于使用省略号的匹配,但比不上使用标准转换的匹配。
使用省略号的匹配。与声明中的省略号匹配的任何序列将归类为使用省略号的匹配。这被视为最弱匹配。
如果内置提升或转换不存在,则用户定义的转换将适用。基于将匹配的参数的类型选择这些转换。考虑下列代码:
// argument_matching1.cpp
class UDC
{
public:
operator int()
{
return 0;
}
operator long();
};
void Print( int i )
{
};
UDC udc;
int main()
{
Print( udc );
}
类 UDC 的可用的用户定义的转换来自 int 类型和 long 类型。因此,编译器会考虑针对将匹配的对象类型的转换:UDC。到 int 的转换已存在且已被选中。
在匹配参数的过程中,标准转换可应用于参数和用户定义的转换的结果。因此,下面的代码将适用:
void LogToFile( long l );
...
UDC udc;
LogToFile( udc );
在前面的示例中,将调用用户定义的转换 operator long 以将 udc 转换为类型 long。如果未定义到 long 类型的用户定义的转换,则按如下所示继续转换:使用用户定义的转换将 UDC 类型转换为 int 类型。将应用从 int 类型到 long 类型的标准转换以匹配声明中的参数。











