以下程序可以正常编译并按预期工作。其输出为:
1
2
#include <stdio.h>
class Foo
{
public:
void Bar(const char* b, ...) { printf("1\n"); };
void Bar(int a, const char* b, ...) { printf("2\n"); };
};
int main()
{
Foo foo1;
foo1.Bar("Test", "xx", 1, 2);
foo1.Bar(1, "xx", "xx", 2, 2);
}
现在,如果我改变int
的第二个参数Bar
的功能为bool
和foo1.Bar(1, "xx", "xx", 2, 2);
成foo1.Bar(true, "xx", "xx", 2, 2);
,那么下面的线将无法编译,我得到的错误:'Foo::Bar': 2 overloads have similar conversions
:
foo1.Bar("Test", "xx", 1, 2);
整个程序无法编译:
#include <stdio.h>
class Foo
{
public:
void Bar(const char* b, ...) { printf("1\n"); };
void Bar(bool a, const char* b, ...) { printf("2\n"); };
};
int main()
{
Foo foo1;
foo1.Bar("Test", "xx", 1, 2); // error: 'Foo::Bar': 2 overloads have similar conversions
foo1.Bar(true, "xx", "xx", 2, 2);
}
我不明白为什么第二种情况不明确。
编辑
但是,如果指针隐式转换为bool
,为什么随后进行编译?
#include <stdio.h>
class Foo
{
public:
void Bar(const char* b) { printf("1\n"); };
void Bar(bool a) { printf("2\n"); };
};
int main()
{
Foo foo1;
foo1.Bar("Test");
foo1.Bar(true);
}
当您与匹配"Test", "xx", 1, 2
时const char*, ...
,第一个参数的转换序列具有完全匹配的排名,第二到第四个参数是省略号转换序列。因此(完全匹配,省略号,省略号,省略号)。
当与匹配"Test", "xx", 1, 2
时bool, const char*, ...
,第一个参数的第一个转换序列具有转换等级;第二个是精确匹配,第三个和第四个是省略号转换序列。换句话说,(转换,完全匹配,省略号,省略号)。
精确匹配胜过转换;一切胜过省略号(请参阅[over.ics.rank])。因此,在这里我们有一个所谓的纵横交错情况,其中一个函数对一个参数的转换顺序更好,而另一个函数对另一个参数的转换顺序更好。因为一个功能要好于另一个功能的必要(但不充分)条件是,转换顺序都不比另一个功能([over.match.best] / 1)差,所以这两个功能都没有比其他更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句