继承公有/保护/私有构造函数

3
如果我理解正确:
class Base { /*...*/ };
class Derived: public Base { public: using Base::Base; }

将强制继承Derived中所有Base构造函数。

那么公共/保护/私有构造函数呢?

class Base {
    friend void g();
public:
    Base (A a);
protected:
    Base (B b);
private:
    Base (C c);
};

class Derived: public Base {
public:
    using Derived::Derived;
};

我找不到关于这个的任何规范,但是我尝试了以下方法:

void f () {
    Derived{A{}}; // OK
    Derived{B{}}; // Inaccessible
    Derived{C{}}; // Inaccessible
}

void g () {
    Derived{A{}}; // OK
    Derived{B{}}; // OK
    Derived{C{}}; // OK
}

似乎,当决定继承哪些构造函数时,using Base::Base 不考虑访问修饰符(它继承了私有的构造函数),但是它会继承这些具有修饰符的构造函数(私有/保护的构造函数仍然对其他对象不可见),并且它允许 Base 的友元可以访问 Derived 继承自 Base 的私有/保护构造函数(友情关系不被继承,所以 g 不是 Derived 的朋友,但它仍然可以访问从 Base 继承的 Derived 的私有/保护构造函数)。

这是正确和标准的行为吗?

1个回答

2
您要查找的规范在[namespace.udecl] ¶19中,重点是我的。
引用如下:

命名构造函数的using-declarator并不会创建同义词;相反,如果使用它们来构造相应基类的对象时可以访问,则可以访问额外的构造函数,并且忽略using-declaration的可访问性。

您的测试与该段落一致。当在您检查的作用域中构造Base时,可访问性检查会成功或失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接