在标准中,什么是"derived-declarator-type"?

In the standard, what is "derived-declarator-type"?

本文关键字:derived-declarator-type 什么 标准      更新时间:2023-10-16

在C++(C++11)标准的不同地方,声明是根据派生的声明符类型列表来描述的。我正在研究右价参考文献,在这种情况下,这个术语的使用至关重要(§8.3.2):

在声明中T D,其中D具有
 nbsp nbsp&属性说明符seqoptD1
nbsp nbsp amp&属性说明符seqoptD1
,声明中的标识符类型T D1为">派生声明符类型列表T,"则D的标识符的类型是">T引用的派生声明符列表。">

不幸的是,标准中从未定义类别">派生的声明符类型"。(我仔细查看了"派生"一词的每一个用法,此外,这可能在这里和这里得到了证实。)

因为">派生的声明符类型列表"是斜体的,我认为它指的是一个类别,而不是变量标签,如T(因此,我不同意Doug Gwyn在我刚刚给出的第二个链接中的评估,即"我们本可以使用X而不是'衍生的声明符列表'")。

C++11标准中派生的声明符类型的定义是什么?

它就在那里定义。这是一种将T之前的内容传送到下一个类型的方法,类似于:

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

它只是T D1类型中T之前的任何内容。

例如,如果具有声明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的类型是"pointer to int"。该类型表示为这些类似英语的句子。

示例1int *(&p)[30]

这是一份声明T D,其中(§8.3.1指针):

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

D具有以下形式:

*属性说明符seqoptcv限定符seqoptD1

其中D1(&p)[3]。这意味着T D1的形式为int (&p)[3],其类型为"引用3个int的数组"(您可以递归计算,下一步使用§8.3.4数组,依此类推)。int之前的所有内容都是派生的声明符类型列表。因此,我们可以推断,在我们的原始声明中,p具有类型"引用指向int的3个指针的数组"。魔术

示例2float (*(*(&e)[10])())[5]

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

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

D的形式为:

D1 [常量表达式opt]属性说明符seqopt

其中D1(*(*(&e)[10])())。这意味着T D1的形式为float (*(*(&e)[10])()),其类型为"引用()返回浮点指针的函数的10个指针的数组"(通过应用§8.3/6,然后应用§8.3.1指针等计算得出)。float之前的所有内容都是派生的声明符类型列表。因此,我们可以推断,p在我们的原始声明中具有类型"引用10的数组指针到()的函数,返回指针到5的浮点数组"。又变魔术了!