继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败

Inherited constructor, compiles in clang++3.9, fails in g++ 7

本文关键字:编译 g++ 失败 clang++3 构造函数 继承      更新时间:2023-10-16

此代码片段

struct Base{};
struct Derived: Base{
using Base::Base;
};
int main() 
{
Base b;
Derived d{b};
}

在 clang++3.9 上编译良好,但是在所有 gcc(包括 7(和版本低于 3.9 的 clangs 上都失败,错误为 msg

error: 没有匹配函数来调用 'Derived::D erived(( Derived d{b}'。

上述代码是否符合标准?

PS:如果我注释掉using Base::Base行,代码在 clang-3.9 上不再编译。

这是CWG 2356。似乎 gcc 和 clang 都已经实现了这一点(clang 4.0+ 拒绝了它(,尽管它仍然"暂时准备好"并且尚未实际被纳入工作草案。 甚至认为它只是上个月通过P1114在拉珀斯维尔刚刚被采纳到工作草案中。

那里的规则是:

从类类型C(15.6.3 [class.inhctor.init]( 继承的构造函数,其第一个参数类型为"引用cv1P"(包括从模板实例化的此类构造函数(在构造cv2类型的对象时D如果参数列表只有一个参数并且CP引用相关,并且PD引用相关,则从候选函数集中排除

这排除了Base复制构造函数的考虑(在我们的例子中,CP都是B的,并且BD引用相关(,这就是两个编译器都拒绝你的代码的原因。