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],T是int,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 - > intD - > *(&p)[3]D 有形式:
*attribute-specifier-seq opt cv-qualifier-seq optD1
哪里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 - > floatD - > (*(*(&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浮点数组的指针".再次魔术!