继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败
Inherited constructor, compiles in clang++3.9, fails in g++ 7
此代码片段
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
如果参数列表只有一个参数并且C
与P
引用相关,并且P
与D
引用相关,则从候选函数集中排除
这排除了Base
复制构造函数的考虑(在我们的例子中,C
和P
都是B
的,并且B
与D
引用相关(,这就是两个编译器都拒绝你的代码的原因。