有什么方法可以将数组(而不仅仅是它的元素)声明为 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。
使用 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。