私有使用基础构造函数的声明不是私有的

wal*_*lly 7 c++ inheritance constructor using-declaration

using基础构造函数的声明是私有的,但仍然可以构造该类.为什么?

可访问性对于必须公开operator[]using声明的工作方式不同.

#include <vector>

template<typename T>
class Vec : std::vector<T>
{
private:
    using std::vector<T>::vector;       // Works, even if private. Why?
public:
    using std::vector<T>::operator[];   // must be public
};

int main(){
    Vec<int> vec = {2, 2};
    auto test = vec[1];
}
Run Code Online (Sandbox Code Playgroud)

如果我希望构造函数是私有的,该怎么办?可以用using声明来完成吗?

Jus*_*tin 7

无论基类的可访问性如何,基类构造函数的using声明都保持与基类相同的可访问性.来自[namespace.udecl]:

由using声明创建的同义词具有成员声明的通常可访问性.命名构造函数的using-declarator不会创建同义词; 相反,如果在用于构造相应基类的对象时可以访问其他构造函数,则可以访问这些构造函数,并忽略using声明的可访问性

重点补充

用简单的英语,从cppreference:

它具有与相应基础构造函数相同的访问权限.

如果希望"继承"构造函数为私有,则必须手动指定构造函数.您不能使用using声明来执行此操作.

  • 问题实际上是关于保持继承的构造函数私有.似乎用这个花哨的规则,用"使用"声明来实现这一目标是不可能的.或者一般改变访问权限. (2认同)
  • *"如果在用于构造相应基类的对象时它们是可访问的,则可以访问其他构造函数"*它们不应该是不可访问的,因为第一个地方不能访问整个基类吗?我似乎这个部分实际上被解释为"无论用于继承的访问说明符". (2认同)