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

Lin*_*gxi 4 c++ arrays syntax const language-lawyer

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

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

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

f({1, 2, 3});
Run Code Online (Sandbox Code Playgroud)

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

typedef int ArrOfInt[3];

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

f({1, 2, 3});
Run Code Online (Sandbox Code Playgroud)

我的问题是:C++是否具有const数组类型的内联定义的语法,因此typedef首先不需要a ?

Bri*_*ian 5

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

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

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

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

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

([basic.type.qualifier]/5)

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

void f(const int (&a)[3]);
Run Code Online (Sandbox Code Playgroud)

const仍然附连到元件的类型,但在阵列类型也const,因此参考是一个左值参照const的类型.这就是为什么它可以绑定到临时的.