定义 const 数组类型的语法

Syntax for defining const array type

请注意,我只对 C++ 语法的可能性感兴趣,而不是任何实际用途。

定义数组类型很容易。例如,int a[3]; 定义了 3 int 的数组类型,而 const int a[3];int const a[3]; 定义了 3 const int 的数组类型。三种形式中的 None 实际上定义了某种类型 Tconst 数组 (当然,它本身可以被 const 修饰)。因此,以下代码将无法编译:

void f(int (&a)[3]) {...}

f({1, 2, 3});

原因很简单:非 const lval 引用不能绑定到临时 rval。更正代码的一种方法是:

typedef int ArrOfInt[3];

void f(const ArrOfInt& a) {...}

f({1, 2, 3});

我的问题是:C++ 是否具有常量数组类型的内联定义的语法,因此一开始就不需要 typedef

数组没有与其元素分开的 cv 限定,因此您要求的是不存在的东西。引用标准,

Any cv-qualifiers applied to an array type affect the array element type, not the array type (8.3.4).

(N3936 中的[basic.type.qualifier]/2)

但是接着说,当元素类型被限定时,数组类型也被认为是合格的:

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

([basic.type.qualifier]/5)

而且您编写的代码确实可以在没有 typedef 的情况下重写。声明符语法是

void f(const int (&a)[3]);

const 仍然附加到元素类型,但数组类型也是 const,因此引用是对 const 类型的左值引用。所以这就是为什么它可以绑定到一个临时的。

这是核心问题的主题 #1059:

There does not appear to be a definitive normative statement answering the question of whether an array with a const-qualified element type is itself const-qualified; [...]

... 在 C++11 批准后立即解决。现在 [basic.type.qualifier]/5 读取:

Cv-qualifiers applied to an array type attach to the underlying element type, so the notation “cv T,” where T is an array type, refers to an array whose elements are so-qualified. An array type whose elements are cv-qualified is also considered to have the same cv-qualifications as its elements.

因此不可能生成数组元素 const 而不是封闭数组本身,反之亦然。
例如

const int arr[2];

在这里,arr 是(顶级)conststd::is_const<decltype(arr)>{}true),它的元素也是。而在

void f(const (&a)[3]) {...}

a 指的是具有 const 个元素的 const 数组。