处理基类子对象的表达式的动态类型

时间:2019-06-28 19:51:49

标签: c++ pointers language-lawyer lvalue subobject

我再次问这个问题,因为像这样的only other question已有10年历史了,其中包含有关涉及基类子对象的表达式的错误信息:

[defns.dynamic.type]将glvalue的动态类型定义为:

  

glvalue所引用的最派生对象的类型

glvalue最多只能引用一个对象,并且由于[intro.object] p6定义的“最派生对象”实质上是:

  

一个完整的对象,一个数据成员或一个类类型的数组元素,或一个非类类型的对象被称为“最派生对象”。

如果glvalue不引用最派生的对象,那么动态类型会不确定吗?

此外,我知道表达式的动态类型的预期效果是:对于glvalue表达式E,它引用类型为B的对象,该对象是对象的基类子对象类型D,其中BD的基类,以便从D获得类型E,但是,我看不出当前的措辞如何完成或什至需要这样做,因为绑定到派生类类型的基类类型的引用/指针将始终引用基类子对象。据我所知,永远不会发生表达式的类型和它所引用的对象的类型的情况。

2 个答案:

答案 0 :(得分:5)

  

如果glvalue不引用派生程度最高的对象,那么动态类型会不确定吗?

总是如此。因此,“那么”部分不适用。

根据评论进行更新

给予

struct foo { };
struct bar : foo { };
const foo& a = bar(); a;

a的动态类型是什么?

答案在page you linked to in your post中找到:

  

[示例::如果静态类型为“指向类p的指针”的指针B指向类D的对象,则该对象派生自B,表达式*p的动态类型为“ D”。参考文献的处理方式相似。 -示例]

a的动态类型是bar,而不是foo

答案 1 :(得分:3)

我认为您也许可以辩称这是措辞上的缺陷,但是由于意图已经很明确了,所以这将是徒劳的。代替:

  

glvalue所引用的最派生对象的类型

您可能会想到该定义为:

  

glvalue所引用对象的最派生对象的类型