此代码段
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上编译。
答案 0 :(得分:2)
这是CWG 2356。看来gcc和clang都已经实现了这一点(clang 4.0+拒绝了它),尽管它仍然“暂时准备好”并且还没有被实际应用到工作草案中。甚至认为它只是被采纳了。上个月通过P1114进入了Rapperswil的工作草案。
这里的规则是:
从类类型
C
(15.6.3 [class.inhctor.init])继承的构造函数,其构造函数的第一个参数类型为“对 cv1P
的引用”如果构造参数类型为 cv2D
的对象(如果参数列表中只有一个参数且{{1}),则从候选函数集中排除(包括从模板实例化的此类构造函数) }与C
有关,而P
与P
有关。
这将D
复制构造函数排除在考虑范围之外(在我们的情况下,Base
和C
都是P
,而B
与{ {1}}),这就是两个编译器都拒绝您的代码的原因。