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),但它仅适用于它们具有相同的参数类型(忽略那些正在使用默认参数的参数)。
在下面的程序中,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),但它仅适用于它们具有相同的参数类型(忽略那些正在使用默认参数的参数)。