深度探究C++中的函数重载的用法

2020-01-06 14:34:16王冬梅

此同一规则适用于指向成员的指针转换。从 T D::* 类型到 T C::* 类型的转换优于从 T D::* 类型到 T B::* 类型的转换等(其中,T 是该成员的类型)。
前面的规则仅沿派生的给定路径应用。考虑下图中显示的关系图。

深度探究C++中的函数重载的用法

演示首选转换的多继承关系图
从 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 类型的标准转换以匹配声明中的参数。