使用声明冲突重载

时间:2018-06-13 17:22:31

标签: c++ c++11 language-lawyer using-declaration

#include <iostream>
struct A {
  void test() { std::cout << "A\n"; }
};
struct B : A {
  void test() { std::cout << "B\n"; }
};
struct C : B {
  using A::test;
  using B::test;
};
int main() {
  C().test();  // Is this ambiguous?
  return 0;
}

在此示例中,g ++ 8.1.0成功编译并从test()调用B

clang ++ 3.8.0报告:error: call to member function 'test' is ambiguous

哪个是对的?如果是g ++,那么选择B::test而不是A::test的规则是什么?

2 个答案:

答案 0 :(得分:1)

我相信Clang是对的。 根据{{​​3}}:

  

由于 using-declaration 是一个声明,因此对同一声明区域([basic.scope])中同名声明的限制也适用于 using-declarations

由于您无法声明两个相同的成员函数,因此同样适用于using声明。

答案 1 :(得分:0)

GCC让它编译,test()调用成为第一个声明。在给出的示例中,它会调用A::test()。但ISO C ++将其定义为含糊不清。 Visual Studio和clang不允许你编译它。此外,这是VS错误消息:'B::test': ambiguous call to overloaded function。在我看来,GCC让它编译是错误的。