作为练习,我实现了一个名为 Array 的类来模拟 std::array 类的大部分功能。我努力实现的一件事如下。假设我们有以下声明:
std::array<int,5> a1;
std::array<int,5> a1{};
const std::array<int,5> a1;
const std::array<int,5> a1{};
第三次初始化显示错误:
Default initialization of an object of const type 'const std::array<int, 5>' without a user-provided default constructor
我想为我实现的课程实现相同的目标,但现在:
Array<int,5> a1;
Array<int,5> a1{};
const Array<int,5> a1;
const Array<int,5> a1{};
但是,即使第三次初始化也有效,因为我只重写了默认构造函数,如下所示:
Array() = default;
我在网上看到了一些推荐使用的解决方案:
Array() const = delete;
但这在“语法”上也是不正确的。构造函数中不允许使用 Const 限定符。
有办法解决这个问题吗?
const
和非const
对象之间通常不可能有不同的初始化行为。没有办法重载构造函数。
您用
std::array
显示的内容是该规则的唯一例外,该规则的存在纯粹是为了确保用户不会意外地将对象默认初始化为不确定状态,而该状态永远无法修改为可用状态(因为const
),这基本上总是一个错误。
您可以找到此例外的规则,例如在cppreference。如果类型不是 const-default-constructible,则例外。
实现这一目标的唯一方法是
int
)通常没有充分的理由故意让成员未初始化,所以我不建议尝试走这条路。这个特殊规则的存在纯粹是为了避免犯下未初始化的错误。
不,对象不在其构造函数或析构函数中
const
,因为 const
构造函数几乎不能做任何事情。