如何在C++中实现类似std::array的const对象默认初始化限制
解决自定义Array类模拟std::array的const默认初始化报错问题
要让你的自定义Array类和std::array保持一致的初始化行为,核心是让Array类成为聚合类型,而非显式声明默认构造函数。
问题根源
std::array是C++标准定义的聚合类型,聚合类型的规则是:没有用户声明的构造函数、没有私有/保护的非静态数据成员、无基类、无虚函数等。当你声明const std::array<int,5> a1;时,属于对const聚合对象的默认初始化,但聚合类型的默认初始化不会初始化内置类型的成员,而const对象必须被明确初始化,因此编译器会抛出你提到的错误。
而你当前的Array类因为显式声明了Array() = default;,即使是默认生成的构造函数,也属于用户声明的构造函数,这会让Array类失去聚合类型的身份。此时编译器会调用这个默认构造函数初始化const对象,不会触发报错,和std::array的行为不一致。
解决方案
去掉显式声明的默认构造函数,让Array类满足聚合类型的条件。
示例代码:
#include <cstddef> template<typename T, size_t N> class Array { public: // 去掉显式声明的Array() = default; T data[N]; // 必须是public的,否则不符合聚合类型要求 // 其他成员函数(比如operator[]、size()等)可以保留,只要不破坏聚合类型规则 T& operator[](size_t idx) { return data[idx]; } const T& operator[](size_t idx) const { return data[idx]; } size_t size() const { return N; } };
此时测试四种初始化场景:
Array<int,5> a1;:聚合默认初始化,data数组的元素未初始化(和std::array一致)Array<int,5> a1{};:聚合值初始化,data数组的元素被值初始化(int类型会被置为0,和std::array一致)const Array<int,5> a1;:编译器会抛出和std::array完全一致的错误,提示const类型对象未初始化const Array<int,5> a1{};:聚合值初始化,合法,元素被正确初始化(和std::array一致)
注意事项
- 聚合类型要求非静态数据成员必须是public的,所以你的
data数组不能设为private,这和std::array的内部实现一致(std::array的底层数组也是public的聚合成员) - 不要添加任何用户声明的构造函数、析构函数、虚函数,否则会破坏聚合类型的身份
内容的提问来源于stack exchange,提问作者bhuseinovi1
相关产品推荐
相关产品推荐

