【问题标题】:Inherited constructor, compiles in clang++3.9, fails in g++ 7继承的构造函数,在 clang++3.9 中编译,在 g++7 中失败
【发布时间】:2018-12-12 05:42:11
【问题描述】:

这段代码sn-p

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 的版本会发出错误消息

错误:没有匹配函数调用“Derived::Derived() Derived d{b}”。

以上代码是否符合标准?

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

【问题讨论】:

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


    【解决方案1】:

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

    规则是:

    从类类型C (15.6.3 [class.inhctor.init]) 继承的构造函数,其第一个参数类型为“reference to cv1 P”(包括这样的从模板实例化的构造函数)在构造 cv2 D 类型的对象时从候选函数集中排除,如果参数列表只有一个参数并且 C 与 @987654327 引用相关@ 和 PD 引用相关。

    这不包括Base 复制构造函数(在我们的例子中CP 都是B,而BD 引用相关),这就是两个编译器都拒绝的原因你的代码。

    【讨论】:

    • 谢谢,为了确保我理解,CWG 2356 提案应该使代码无效,对吧?因此,我将定义一个显式复制 ctor 来调用基本的复制 ctor。
    • 2356 被 Rapperswil 采用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多