请注意,我只是对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
?
答案 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
是(顶级)const
(std::is_const<decltype(arr)>{}
是true
),其元素也是如此。并在
void f(const (&a)[3]) {...}
a
指的是const
数组,其中包含const
个元素。