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

Overload resolution between constructor and inherited constructor in C++ - which compiler is correct?

在下面的程序中,struct B 从其基础 A 继承了 B(int) 删除的构造函数,并且还定义了额外的构造函数 B(int&&)。然后使用 B b(1):

创建一个 B 的对象
struct A {
    A() {}
    A(int) = delete;
};

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

int main() {
    B b(1);
}

如果构造函数 B(int)B(int&&) 都直接在 B 中定义,结果将是构造函数选择的歧义。在这个例子中,GCC 打印出 a

call of overloaded 'B(int)' is ambiguous`

也有错误。

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

这里是哪个编译器?

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