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

时间:2018-05-03 21:30:27

标签: 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];
}

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

2 个答案:

答案 0 :(得分:7)

对基类构造函数的使用声明保持与基类相同的可访问性,而不管基类的可访问性如何。来自[namespace.udecl]

  

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

强调添加

用简单的英语from cppreference

  

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

如果你想要&#34;继承&#34;构造函数是私有的,您必须手动指定构造函数。你不能用using声明来做到这一点。

答案 1 :(得分:3)

using reference表示继承的构造函数

  

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

它进一步暗示了这背后的基本原理:

  

如果用户定义的构造函数满足constexpr构造函数要求,则为constexpr。如果删除相应的基本构造函数或者删除默认的默认构造函数,则删除它

显然,您不能明确constexprdelete继承的构造函数,因此这些特性只是继承。访问级别也是如此。