如何在C++中实现const对象特定的构造函数?

问题描述 投票:0回答:2

作为练习,我实现了一个名为 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 限定符。

有办法解决这个问题吗?

c++ class constructor compiler-errors constants
2个回答
0
投票

const
和非
const
对象之间通常不可能有不同的初始化行为。没有办法重载构造函数。

您用

std::array
显示的内容是该规则的唯一例外,该规则的存在纯粹是为了确保用户不会意外地将对象默认初始化为不确定状态,而该状态永远无法修改为可用状态(因为
const
),这基本上总是一个错误。

您可以找到此例外的规则,例如在cppreference。如果类型不是 const-default-constructible,则例外。

实现这一目标的唯一方法是

  • 根本不声明默认构造函数,或者按照您所展示的那样默认它,并且
  • 故意让类的成员被默认的默认构造函数保留在不确定状态(例如,没有默认初始化程序的
    int

通常没有充分的理由故意让成员未初始化,所以我不建议尝试走这条路。这个特殊规则的存在纯粹是为了避免犯下未初始化的错误。


0
投票

不,对象不在其构造函数或析构函数中

const
,因为
const
构造函数几乎不能做任何事情。

© www.soinside.com 2019 - 2024. All rights reserved.