与 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
声明。
#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
声明。