定义 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 实际上定义了某种类型 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++ 是否具有常量数组类型的内联定义的语法,因此一开始就不需要 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
是(顶级)const
(std::is_const<decltype(arr)>{}
是 true
),它的元素也是。而在
void f(const (&a)[3]) {...}
a
指的是具有 const
个元素的 const
数组。
请注意,我只对 C++ 语法的可能性感兴趣,而不是任何实际用途。
定义数组类型很容易。例如,int a[3];
定义了 3 int
的数组类型,而 const int a[3];
或 int const a[3];
定义了 3 const int
的数组类型。三种形式中的 None 实际上定义了某种类型 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++ 是否具有常量数组类型的内联定义的语法,因此一开始就不需要 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
,” whereT
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
是(顶级)const
(std::is_const<decltype(arr)>{}
是 true
),它的元素也是。而在
void f(const (&a)[3]) {...}
a
指的是具有 const
个元素的 const
数组。