与基类子对象相关的表达式的动态类型

Dynamic type of an expression dealing with a base class subobject

本文关键字:表达式 动态 类型 基类 对象      更新时间:2023-10-16

我再次问这个问题,因为唯一的其他问题正在接近10年的历史,并且包含有关涉及基类次级对象的表达式的错误信息:

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

glvalue涉及最派生的对象的类型

glvalue最多是一个对象,并且由于[Into.Object] P6定义的"最派生的对象"本质上是:

完整的对象,数据成员或类类型的数组元素,或者,非类型类型的对象称为最派生的对象。

如果glvalue不参考最派生的对象,那么动态类型是否不确定?

另外,我知道表达式动态类型的预期效果是:对于glvalue表达式E,它是指类型B的对象,该对象是类型D的对象的基类子对象,其中B是基本D类,要从E获取D类型,但是,由于当前的措辞如何完成甚至需要,因为绑定到派生类类型的基类类型的参考/指示器总是会引用基本类子对象。据我所知,一种表达式类型和所指对象的类型永远不会发生的情况。

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

总是这样做。因此,"然后"部分不适用。

响应评论

更新

给定

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

a的动态类型是什么?

答案在您在帖子中链接到的页面中找到:

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

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

我认为您可能会说这是一个措辞缺陷,但是这是ped的,因为意图已经很明确。而不是:

glvalue涉及最派生的对象的类型

您可能会想象定义读取:

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