参数匹配
重载函数为函数声明最佳匹配在当前范围中选择要在提供的参数函数调用。 如果找到相应的函数,该函数调用。" 相应的”此上下文指以下操作之一:
找到完全匹配。
常用转换执行。
整数提升执行。
为所需的参数类型的标准转换。
个用户定义的转换 (转换运算符或构造函数) 为所需的参数类型存在。
找到省略号表示的参数。
编译器创建一组每个实参的候选函数。 候选函数位于该位置的实参可以转换为形参的类型的函数。
设置 “最好匹配的函数”为每个参数被编译,并且,所选函数是交集所有设置。 如果交集包含多个功能,重载不明确并生成错误。 最终将选择的函数比其他函数始终是更好的与至少一个参数的组中。 如果不是这样 (如果没有完整胜利者),该函数调用将生成错误。
考虑下列声明 (函数标记为 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:具有类型部分的第一个参数的候选函数 |
设置 2:可以将键入 int 第二个参数的候选函数 |
---|---|
变量 1 |
变量 1 使用标准转换, (int 可以转换为 long ) |
变量 3 |
|
在设置为 2 的功能是具有隐式强制转换从实参类型为形参类型的功能,因此,在这些功能中具有 “expense”的转换实参类型转换为形参类型最小的函数。
这两个集合的交集是不同 1。 不明确的示例函数调用是:
F1 = Add( 3, 6 );
前面的函数调用以下设置生成:
设置 1:具有 type int 的第一个参数的候选函数 |
设置 2:具有 type int 的第二个参数的候选函数 |
---|---|
变量 2 使用标准转换, (int 可以转换为 long ) |
变量 1 使用标准转换, (int 可以转换为 long ) |
请注意在这两个之间的交集为空。 因此,编译器生成一条错误消息。
对于匹配,该功能与 n 默认参数的参数将 n+1分隔功能,每个带参数的一个不同的数字。
省略号 (...) 作为通配符;它与任何实参。 ,如果不设计重载函数设置必须十分谨慎,则可能导致许多明确设置。
备注
重载函数多义性无法确定的,直到遇到函数调用。此时,将为每个参数已针对函数调用,因此,您可以确定明确的重载是否存在。这意味着出现在代码可以保持,直到它们由特定唤起函数调用。