私有使用基构造函数的声明不是私有的
Private using declaration of base constructor is not private
基构造函数的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
声明来完成吗?
基类构造函数的 using 声明保持与基类相同的可访问性,而不考虑基类的可访问性。 从 [命名空间.udecl]:
由 using-声明创建的同义词具有成员声明的通常可访问性。命名构造函数的 using 声明器不会创建同义词;相反,如果其他构造函数在用于构造相应基类的对象时可访问,则其他构造函数是可访问的,并且忽略 using-声明的可访问
性
强调添加
用简单的英语来说,来自cpp偏好:
它具有与相应基构造函数相同的访问权限。
如果希望"继承的"构造函数是私有的,则必须手动指定构造函数。不能使用 using 声明执行此操作。
using
引用声明继承的构造函数
具有与相应基构造函数相同的访问权限。
它进一步暗示了这背后的基本原理:
constexpr
用户定义的构造函数是否满足constexpr
构造函数要求。如果删除了相应的基构造函数,或者将删除默认的默认构造函数,则会将其删除
显然,您不能显式constexpr
或delete
继承的构造函数,因此这些特征只是继承的。访问级别也是如此。
相关文章:
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- Arduino C++在构造函数中用参数声明对象数组
- 声明没有默认构造函数的字段
- 构造函数/函数声明参数列表中的统一初始化
- 让某个类的 '=' 运算符在声明时运行构造函数
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 强制使用默认构造函数对成员进行未初始化的声明
- 关于隐式声明的复制构造函数的引用在逻辑上不清楚
- 已弃用隐式声明的复制构造函数
- 无法重新声明构造函数.为什么?
- 在类的私有部分中声明一个数组,并在构造函数中分配数组值
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 将派生类的构造函数声明为父类的友元
- C++ 声明继承的构造函数?
- 为什么我的对象声明不调用默认构造函数?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 在C++中,当没有为类声明构造函数时,如果我用参数构造一个对象会发生什么
- 尝试声明构造函数时,输入末尾的预期"{"
- 是否可以在声明构造函数的头文件中提供构造函数的定义
- 这就是声明构造函数private和声明=delete之间的区别