与 using 声明冲突的重载

Conflicting overloads with 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 编译成功并从 B 调用 test()

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

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

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

我相信 Clang 是正确的。 根据[namespace.udecl]/13:

Since a using-declaration is a declaration, the restrictions on declarations of the same name in the same declarative region ([basic.scope]) also apply to using-declarations.

由于不能声明两个相同的成员函数,这同样适用于 using 声明。