2
#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

4

2 回答 2

1

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

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

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

于 2018-06-13T18:52:15.737 回答
0

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

于 2018-06-13T18:35:57.820 回答