使用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。