重载,可变参数函数和布尔类型

贾伯沃基

以下程序可以正常编译并按预期工作。其输出为:

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的功能为boolfoo1.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);
}
TC

当您与匹配"Test", "xx", 1, 2const char*, ...,第一个参数的转换序列具有完全匹配的排名,第二到第四个参数是省略号转换序列。因此(完全匹配,省略号,省略号,省略号)。

当与匹配"Test", "xx", 1, 2bool, const char*, ...,第一个参数的第一个转换序列具有转换等级;第二个是精确匹配,第三个和第四个是省略号转换序列。换句话说,(转换,完全匹配,省略号,省略号)。

精确匹配胜过转换;一切胜过省略号(请参阅[over.ics.rank])。因此,在这里我们有一个所谓的纵横交错情况,其中一个函数对一个参数的转换顺序更好,而另一个函数对另一个参数的转换顺序更好。因为一个功能要好于另一个功能的必要(但不充分)条件是,转换顺序都不比另一个功能([over.match.best] / 1)差,所以这两个功能都没有比其他更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章