在标准中,什么是“导出声明符类型”?(In the standard, what is “deriv

2019-07-04 18:33发布

在C ++(C ++ 11)标准不同的地方,声明在派生声明符类型列表来描述。 我学习右值引用和使用该术语是在这方面(§8.3.2)关键:

在声明TD其中d具有任一形式
属性说明符-SEQ 选择 D1
&& 属性说明符-SEQ 选择 D1
和在声明ŤD1标识符的类型是“ 衍生的说明符类型列表 T,”然后d的标识符的类型是“ 衍生的说明符类型列表参考至T”。

不幸的是,类别“ 衍生的说明符类型的 ”永远不会在标准中定义。 (我通过每次使用单词“衍生”的一看,除了这可能证实在这里和这里 。)

因为“ 导出声明符类型列表 ”是斜体,我认为它是指一类,而不是一个变量标签,如T (因此,我不同意道格·格温的第二环节评估中,我只是给了,“我们也可以使用X代替“ 衍生的说明符类型列表 “”)。

什么是衍生声明符型在C ++ 11标准的定义?

Answer 1:

它被定义在那里,然后。 它携带的任何方式来之前T跨到下一类型,类似于:

<some stuff> T
<some stuff> reference to T

这之前只是无论发生什么T的类型T D1

例如,如果有声明int& (*const * p)[30] TintD& (*const * p)[30]D1(*const * p)[30] 的类型的T D1是“指向常量指针至30 INT的数组”。 因此,根据你所引用的规则的类型, p是“指向常量指针为30参考为int数组”。

当然,这一声明随后被§3.4.2/ 5不允许的:

应当有以引用的引用,没有引用的数组,并没有引用任何指针。

我认为它是一个衍生的声明符类型列表非正式术语来自一个派生类型 (类似于C ++的化合物型)的C标准的定义:

任何数量的派生类型的可以从对象,功能,和不完全类型来构建,如下所示:

  • 数组类型 [...]
  • 一个结构式 [...]
  • 一个联合类型 [...]
  • 一个功能类型 [...]
  • 一个指针类型 [...]

在回应的评论:看来你要的类型和声明符之间的混淆。 例如,如果int* p是说明符,那么类型p是“指针为int”。 该类型是表示为这些类似英语的句子。

实施例1: int *(&p)[30]

这是一个声明, TD其中(§8.3.1指针):

  • T - > int
  • D - > *(&p)[3]

D的形式为:

* 属性符-SEQ 选择 CV-预选赛-SEQ 选择 D1

其中D1(&p)[3] 这意味着T D1的形式为int (&p)[3]其具有输入“参照3的阵列int ”(你工作了这一点递归,使用§8.3.4阵列等下一工序)。 在之前的一切int派生声明符类型列表 。 因此,我们可以推断, p在我们原来的声明的类型为“参考3指针数组int ”。 魔法!

实施例2: float (*(*(&e)[10])())[5]

这是一个声明, TD其中(§8.3.4阵列):

  • T - > float
  • D - > (*(*(&e)[10])())[5]

D是以下形式:

D1 [ 常数表达式选择 ] 属性说明符-SEQ 选择

其中D1(*(*(&e)[10])()) 这意味着T D1的形式为float (*(*(&e)[10])())其具有输入“参照10指针数组的(功能)返回指针到浮动”(你通过应用计算出§8.3/ 6,然后§8.3.1指针等等)。 在之前的所有float派生声明符类型列表 。 因此,我们可以推断, p在我们的原始声明的类型为“参照10指针数组()返回指针到5浮子的阵列的功能”。 再神奇!



文章来源: In the standard, what is “derived-declarator-type”?