C++ 中构造函数和继承构造函数之间的重载解析 - 哪个编译器是正确的?

Fed*_*dor 7 c++ language-lawyer overload-resolution

在下面的程序中,从其基类struct B继承已删除的构造函数,并且还定义了附加构造函数。然后创建一个对象:B(int)AB(int&&)BB b(1)

struct A {
    A() {}
    A(int) = delete;
};

struct B : A {
    using A::A;
    B(int&&) {}
};

int main() {
    B b(1);
}
Run Code Online (Sandbox Code Playgroud)

如果构造函数B(int)和B(int&&)都直接在结果中定义,B则构造函数选择会产生歧义。在这个例子中,GCC 打印了一个

重载“B(int)”的调用不明确`

错误也是如此。

但 Clang 更喜欢在 中声明的构造函数B而不是从 继承的构造函数A。演示: https: //gcc.godbolt.org/z/dnErEenE5

这里是哪个编译器?

Dav*_*ing 4

GCC在这里是正确的:有一个决胜局,它更喜欢直接而不是继承的构造函数([over.match.best.general]/2.7),但它仅适用于它们具有相同的参数类型(忽略那些正在使用默认参数的参数类型) 。