基础构造函数的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
声明来完成吗?
答案 0 :(得分:7)
对基类构造函数的使用声明保持与基类相同的可访问性,而不管基类的可访问性如何。来自[namespace.udecl]:
using-declaration创建的同义词具有成员声明的通常可访问性。命名构造函数的using-declarator不会创建同义词;相反,如果在用于构造相应基类的对象时可以访问其他构造函数,则可以访问这些构造函数,并且忽略using声明的可访问性
强调添加
用简单的英语from cppreference:
它具有与相应基础构造函数相同的访问权限。
如果你想要&#34;继承&#34;构造函数是私有的,您必须手动指定构造函数。你不能用using声明来做到这一点。
答案 1 :(得分:3)
using
reference表示继承的构造函数
具有与相应基础构造函数相同的访问权限。
它进一步暗示了这背后的基本原理:
如果用户定义的构造函数满足
constexpr
构造函数要求,则为constexpr
。如果删除相应的基本构造函数或者删除默认的默认构造函数,则删除它
显然,您不能明确constexpr
或delete
继承的构造函数,因此这些特性只是继承。访问级别也是如此。