7

基本构造函数的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声明来完成吗?

4

2 回答 2

7

无论基类的可访问性如何,基类构造函数的使用声明保持与基类相同的可访问性。从[namespace.udecl]

使用声明创建的同义词具有成员声明的通常可访问性。命名构造函数的 using-declarator 不会创建同义词;相反,如果附加构造函数在用于构造相应基类的对象时可访问,则它们是可访问的,并且使用声明的可访问性被忽略

强调添加

用简单的英语,来自 cppreference

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

如果您希望“继承的”构造函数是私有的,则必须手动指定构造函数。你不能用 using 声明来做到这一点。

于 2018-05-03T21:38:51.537 回答
3

using参考声明继承的构造函数

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

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

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

显然,您不能显式地constexprdelete继承的构造函数,因此这些特征只是简单地继承。访问级别也是如此。

于 2018-05-03T21:40:06.173 回答