用于定义const数组类型的语法

时间:2015-04-06 08:25:56

标签: c++ arrays syntax const language-lawyer

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

很容易定义数组类型。例如,int a[3];定义的数组类型为3 int,而const int a[3];int const a[3];定义的数组类型为3 const int。这三种形式实际上都没有定义某种类型T const数组(当然它本身也可以被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 ++是否具有const数组类型的内联定义的语法,因此首先不需要typedef

2 个答案:

答案 0 :(得分:5)

数组没有单独的cv资格,因此你要求的东西不存在。标准,

  

应用于数组类型的任何cv限定符都会影响数组元素类型,而不是数组类型(8.3.4)。

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

然而,它继续说当元素类型合格时,数组类型也被认为是合格的:

  

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

([basic.type.qualifier] / 5)

你写的代码确实可以在没有typedef的情况下重写。声明者语法是

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

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

答案 1 :(得分:1)

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

  

似乎没有明确的规范性声明回答   是否具有const限定元素类型的数组的问题   本身是合格的; [...]

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

  

应用于数组类型的Cv限定符附加到底层   元素类型,因此符号“ cv T,”其中T是数组类型,指的是   到一个元素是如此限定的数组。 一个数组类型   元素是cv-qualified也被认为具有相同的元素   cv-qualifications作为其要素。

因此,不可能制作数组元素const而不是封闭数组本身,反之亦然。
E.g。

const int arr[2];

此处arr是(顶级)conststd::is_const<decltype(arr)>{}true),其元素也是如此。并在

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

a指的是const数组,其中包含const个元素。