是否有办法将数组声明为const,而不仅仅是其元素?



使用std::array,我可以将数组本身和它的对象都声明为const。

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

但是,如果我正确地阅读了标准,像这样的声明只声明了数组元素const。看到这个

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

这个问题的原因是,如果完整的对象,在这些情况下a,是const,那么改变任何子对象是不可能的。如果只有子对象,比如a[0]是const,那么它们可以通过"透明替换"来修改。而且不是UB。这是一个基本的新变化。c++20的生命周期。看到这个。从数组的定义也可以清楚地看出,数组元素是子对象。看到这个

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

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

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

声明的变量类型
const int a[2] {1,2};

2个const int"根据您链接的规则,但它本身是CWG 1059的分辨率的const限定类型,可以在[basic.type]中找到。/3后c++ 20草案:

元素为cv-qualified的数组类型也被认为与其元素具有相同的cv-qualified。

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

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

相关内容

最新更新