在标准中,什么是"derived-declarator-type"?
In the standard, what is "derived-declarator-type"?
在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]
,则T
为int
,D
为& (*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"。该类型表示为这些类似英语的句子。
示例1:int *(&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个指针的数组"。魔术
示例2:float (*(*(&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的浮点数组"。又变魔术了!
- 将sharet_ptr<Derived>转换为shared_ptr<Base>
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 如何使用"derived input class"创建派生类?
- 如何从unique_ptr返回unique_ptr的引用<Derived><Base>?
- 如何将unique_ptr<derived>*转换为<base>unique_ptr*?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 如何从 Eigen::MatrixBase <Derived>获取存储选项
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 从"<Base>std::unique_ptr"创建"ClassType<std::unique_ptr>"时出现编译错误<Derived>
- 为什么在此示例中从unique_ptr自动向上转换<derived>到unique_ptr<base>失败?
- 为什么unique_ptr<Derived>隐式投射到unique_ptr<Base>?
- 候选函数不可行:没有从 std::vector<derived> 到 std::vector <base>的已知转换
- 将static_pointer_cast添加到<Derived> std::list<shared_ptr<Base>> 会导致称为 error 的纯虚拟方法
- 派生到矩阵库转换背后的故事<Derived>
- 如何将标准::make_unique<derived>() 转换为标准::unique_ptr<base>
- 最快的方式 std::vector<Derived> to std::vector<Base>
- shared_from_this with derived class
- Distinc derived class C++
- 将 std::shared_ptr<Derived> 转换为 const <Base>shared_ptr&
- 传递shared_ptr作为<Base>shared_ptr<Derived>