为什么不能公开继承的受保护构造函数?

xml*_*lmx 17 c++ oop inheritance constructor c++11

考虑:

class A
{
protected:
    A(int) {}
    void f(int) {}

public:
    A() {}
};

class B : public A
{
public:
    using A::A;
    using A::f;
};

int main()
{
    B().f(1); // ok
    B(1); // error: 'A::A(int)' is protected within this context
}
Run Code Online (Sandbox Code Playgroud)

为什么不能创建继承的protected构造函数public,而继承的protected成员函数可以?

son*_*yao 11

与其他成员不同,引入继承构造函数的 using 声明的可访问性被忽略。

[namespace.udecl]/19 ,

(强调我的)

using-declaration创建的同义词具有member-declaration的通常可访问。一个使用说明符名称一个构造函数不创建一个同义词; 相反,如果附加构造函数在用于构造相应基类的对象时可访问,则它们是可访问的,并且忽略using 声明的可访问性