删除了构造函数继承

Ric*_*ter 8 c++ inheritance constructor c++11

构造函数继承的一个要求是派生类不能具有任何具有相同签名的构造函数.但我不确定删除函数在这些规则下的行为方式.

class Foo
{
    public:
    Foo() = delete;
    Foo(const Foo& a_Foo) = delete;
    Foo(int a_Value) : m_Value(a_Value) {}

    private:
    int m_Value;
};

class Bar : public Foo
{
    public:
    using Foo::Foo;
    Bar() : Foo(7) {};
    Bar(const Bar& a_Bar) : Foo(12) {};
};
Run Code Online (Sandbox Code Playgroud)
  • 被删除的构造函数是否继承?
  • 如果是这样,Bar()并且Foo()具有相同的签名,这是否会使代码无效?
  • 你可以争辩Foo(const Foo& a_Foo)并且Bar(const Bar& a_Bar) 有不同的签名.复制构造函数如何在构造函数继承下运行?

Bri*_*ian 5

默认,复制和移动构造函数不会被继承,也不能继承构造函数隐式声明派生类的复制或移动构造函数.此外,如果在派生类中已经有一个具有相同签名的构造函数,则继承构造函数声明基本上只是"跳过"基类构造函数.

对于除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外的候选继承构造函数集中的每个非模板构造函数,构造函数隐式声明具有相同的构造函数特征,除非存在用户声明的构造函数完整类中的相同签名,其中出现using声明或构造函数将是该类的默认,复制或移动构造函数.

([class.inhctor]/3)

此外,如果删除相应的基类构造函数,则删除继承的构造函数.

如此声明的构造函数具有与相应构造函数相同的访问权限X.如果删除相应的构造函数,X则删除它(8.4).继承构造函数不应显式实例化(14.7.2)或显式专用(14.7.3).

([class.inhctor]/4)