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 ?
数组没有单独的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的类型.这就是为什么它可以绑定到临时的.