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

Private using declaration of base constructor is not private

本文关键字:声明 构造函数      更新时间:2023-10-16

基构造函数的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构造函数要求。如果删除了相应的基构造函数,或者将删除默认的默认构造函数,则会将其删除

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