在标准中,什么是"派生声明者类型"?

Dan*_*aum 14 c++ standards c++11

在C++(C++ 11)标准的不同位置,声明是根据derived-declarator-type-list描述的.我正在研究右值引用,在这种情况下使用这个术语是至关重要的(§8.3.2):

在声明TD中,其中D具有任一形式
    &attribute-specifier-seq opt D1
    && attribute-specifier-seq opt D1
和声明中的标识符类型T D1是" derived-declarator-type-list T ",那么D的标识符的类型 是" 对T的derived-declarator-type-list reference ".

不幸的是,类别" derived-declarator-type "从未在标准中定义.(我查看了"衍生"这个词的每一次使用,此外这可能在这里这里得到确认.)

因为" derived-declarator-type-list "是斜体,我认为它指的是一个类别,而不是一个变量标签T,因此(因此,我不同意Doug Gwyn在我刚刚给出的第二个链接中的评估"我们可以使用X而不是' derived-declarator-type-list '").

在C++ 11标准中,derived-declarator-type的定义是什么?

Jos*_*eld 12

它正在那里被定义.这是一种将之前的任何内容T传递到下一种类型的方式,类似于:

<some stuff> T
<some stuff> reference to T
Run Code Online (Sandbox Code Playgroud)

它只是之前T的类型T D1.

例如,如果你有声明int& (*const * p)[30],Tint,D& (*const * p)[30]D1(*const * p)[30].类型T D1是"指向指向30 int数组的const指针".因此,根据您引用的规则,类型p是"指向指向30引用数组的数组的const指针".

当然,§3.4.2/ 5不允许这个声明:

不应引用引用,不引用引用数组,也不引用引用指针.

我认为它作为派生声明者类型列表的非正式术语来自C标准的派生类型定义(类似于C++中的复合类型):

可以从对象,函数和不完整类型构造任意数量的派生类型,如下所示:

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

回应评论:似乎你在类型和声明者之间感到困惑.例如,if int* p是声明符,那么类型p是"指向int的指针".类型表示为这些类似英语的句子.

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

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

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

D 有形式:

* attribute-specifier-seq opt cv-qualifier-seq opt D1

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

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

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

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

D 具有以下形式:

D1 [ 常量表达式opt ] attribute-specifier-seq opt

哪里D1(*(*(&e)[10])()).这意味着具有类型"引用指向函数的10指针的数组T D1的形式float (*(*(&e)[10])())"(返回指向float的指针)(通过应用§8.3/ 6然后应用§8.3.1指针等).之前的一切float派生声明符类型列表.所以我们可以推断出p在我们的原始声明中有类型"引用数组的10指针函数()返回指向5浮点数组的指针".再次魔术!

  • @DanNissenbaum"*derived-declarator-type-list*T"中的`T`与`T D1`中的`T`相同.`T D1`中的`T`在§8.3中定义为声明的*attribute-specifier-seq_opt decl-specifier-seq*部分.在我给出的这个例子中,它只是`int`.基本上,`T`是在所有声明符之间共享的声明的一部分(例如`int x,y,*z`). (2认同)