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

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

  • 找到完全匹配项。
  • 已执行不重要的转换。
  • 已执行整型提升。
  • 已存在到所需参数类型的标准转换。
  • 已存在到所需参数类型的用户定义的转换(转换运算符或构造函数)。
  • 已找到省略号所表示的参数。

    编译器为每个参数创建一组候选函数。候选函数是这样一种函数,其中的实参可以转换为形参的类型。

    为每个参数生成一组“最佳匹配函数”,并且所选函数是所有集的交集。如果交集包含多个函数,则重载是不明确的并会生成错误。对于至少一个参数而言,最终选择的函数始终是比组中的所有其他函数更好的匹配项。如果不是这样(如果没有清晰的胜者),则函数调用会生成错误。
    考虑下面的声明(针对下面的讨论中的标识,将函数标记为 Variant 1、Variant 2 和 Variant 3):

    
    Fraction &Add( Fraction &f, long l );    // Variant 1
    Fraction &Add( long l, Fraction &f );    // Variant 2
    Fraction &Add( Fraction &f, Fraction &f ); // Variant 3
    
    Fraction F1, F2;
    
    

    请考虑下列语句:

    
    F1 = Add( F2, 23 );
    

    前面的语句生成两个集:

    集 1:其第一个参数的类型为 Fraction 的候选函数 集 2:其第二个参数可转换为类型 int 的候选函数
    Variant 1 Variant 1(可使用标准转换将 int 转换为 long)
    Variant 3