C++ 使用声明时发生冲突的重载 #包括 结构A{ void test(){std::cout

C++ 使用声明时发生冲突的重载 #包括 结构A{ void test(){std::cout,c++,c++11,language-lawyer,using-declaration,C++,C++11,Language Lawyer,Using Declaration,GCC允许它编译并且test()调用成为第一个声明但是,ISO C++定义了它是模棱两可的。VisualStudio和CLAN不允许您编译它。另外,VS错误消息: B::测试:对重载函数< /COD>的模糊调用。我认为,GCC通过编译它是错误的。< / P> < P>我相信Clang是正确的。 根据: 由于using声明是一种声明,因此对同一声明区域([basic.scope])中同名声明的限制也适用于using声明 由于不能声明两个相同的成员函数,因此同样的情况也适用于使用声明的。此问题可能会

GCC允许它编译并且
test()
调用成为第一个声明但是,ISO C++定义了它是模棱两可的。VisualStudio和CLAN不允许您编译它。另外,VS错误消息:<代码> B::测试:对重载函数< /COD>的模糊调用。我认为,GCC通过编译它是错误的。< / P> < P>我相信Clang是正确的。 根据:

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

由于不能声明两个相同的成员函数,因此同样的情况也适用于使用声明的

此问题可能会帮助您:
#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;
}