使基类保护的构造函数在派生类中公开



有人能解释一下为什么标记的行没有编译吗?在我看来,如果B2D编译,B1也应该编译。

class A1 {
protected:
A1(int){}
};
class B1 : private A1 {
public:
using A1::A1;
};
class A2 {
protected:
A2(int){}
};
class B2 : private A2 {
public:
B2(int i) : A2(i) {}
};
class C {
protected:
void f(int) {}
};
class D : private C {
public:
using C::f;
};
int main() {
// B1 b1(1); // error: calling a protected constructor of class 'A1'
B2 b2(1);
D d;
d.f(1);
}

使用声明在指定构造函数和其他成员时表现不同。对于构造函数,将忽略using声明的可见性;如果通过重载解析进行选择,那么如果构造函数在基类中可见,则可以使用该构造函数。对于所有其他成员,使用声明将同义词引入派生类的作用域,并且该同义词具有的使用声明的可见性。

[namespace.udcl]/19使用声明创建的同义词具有成员声明名构造函数的不会创建同义词;相反,如果附加构造函数在用于构造相应基类的对象时是可访问的,则它们是可访问,并且忽略using声明的可访问性。

最新更新