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

时间:2018-07-03 20:39:42

标签: c++ c++11 language-lawyer

此代码段

struct Base{};
struct Derived: Base{
    using Base::Base;
};

int main() 
{
    Base b;
    Derived d{b};
}

compiles fine on clang++3.9,但是它fails on all gcc's(包括7个)和版本小于3.9的clang,错误为msg

  

错误:没有匹配的函数可调用'Derived :: Derived()Derived d {b}'。

代码是否符合标准?

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

1 个答案:

答案 0 :(得分:2)

这是CWG 2356。看来gcc和clang都已经实现了这一点(clang 4.0+拒绝了它),尽管它仍然“暂时准备好”并且还没有被实际应用到工作草案中。甚至认为它只是被采纳了。上个月通过P1114进入了Rapperswil的工作草案。

这里的规则是:

  

从类类型C(15.6.3 [class.inhctor.init])继承的构造函数,其构造函数的第一个参数类型为“对 cv1 P的引用”如果构造参数类型为 cv2 D的对象(如果参数列表中只有一个参数且{{1}),则从候选函数集中排除(包括从模板实例化的此类构造函数) }与C有关,而PP有关。

这将D复制构造函数排除在考虑范围之外(在我们的情况下,BaseC都是P,而B与{ {1}}),这就是两个编译器都拒绝您的代码的原因。