【问题标题】:Conflicting overloads with using-declaration使用声明冲突的重载
【发布时间】:2018-11-23 08:58:29
【问题描述】:
#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 的规则是什么?

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2019-02-15
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多