如果我正确理解:
class Base { /*...*/ };
class Derived: public Base { public: using Base::Base; }
将强制Base
中所有Derived
构造函数的继承。
但是公共/受保护/私有构造函数呢?
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
的朋友进行私有/受保护的访问(不继承友谊,因此g
不是Derived
的朋友,但仍可以访问Derived
的私有/受保护的构造函数Base
继承自x1
)。
这是正确的标准行为吗?
答案 0 :(得分:1)
您要查找的规范位于 [namespace.udecl] ¶19中,重点是我的。
命名构造函数的 using-declarator 不会创建同义词。 相反,如果在构造相应基础的对象时可以访问其他构造函数,则可以访问它们 类,而 using-declaration 的可访问性将被忽略。
您的测试与此段落一致。可访问性检查失败或完全通过,就像在您检查的范围中构造Base
时一样。