有什么方法可以将数组(而不仅仅是它的元素)声明为 const?

Is there any way to declare a array, not just its elements, as const?

使用 std::array 我可以将数组本身及其对象声明为常量。

const std::array<const int,2> a {1,2};

但是,如果我正确阅读了标准,像这样的声明只会声明数组元素为 const。参见 this

const int a[2] {1,2};

这很重要的原因是如果完整的对象,在这些情况下 a,是 const 那么它是 UB 来改变任何子对象。如果只有子对象,如 a[0] 是常量,那么它们可以通过“透明替换”进行修改,而不是 UB。这是从 c++20 开始对 basic.life 的新更改。参见 this. It's also clear from the definition of arrays that array elements are subobjects. See this

例如,如果完整对象(总数组)不是 const,这将是合法的。

std::construct_at(&a[0], 5);

那么除了使用 std::array 包装器来声明完整的数组 const 之外,还有什么方法吗?

声明的变量类型

const int a[2] {1,2};
根据您链接的规则,

是“2 const int 的数组”,但根据 const 的分辨率,它本身是 const 限定类型 CWG 1059, which can be found in [basic.type.qualifier]/3 post-C++20 草稿:

An array type whose elements are cv-qualified is also considered to have the same cv-qualifications as its elements.

我认为没有 const 限定的数组类型到非 const 限定的元素,也没有非 const 限定的数组类型到 const-限定元素,虽然我猜对象替换规则允许在某些情况下将不同 cv-qualification 的元素放入数组中。

所以 a 已经是一个 const 完整的对象,按照建议的方式修改它就是 UB。