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

Kry*_*n S 0 c++ pointers lvalue language-lawyer subobject

我再次问这个问题,因为唯一的另一个类似问题已经接近10年了,并且包含有关涉及基类子对象的表达式的错误信息:

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

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

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

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

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

另外,我知道表达式的动态类型的预期效果是:对于E引用类型为object的glvalue表达式,该对象是type的对象的B基类子对象D,其中B是的基类D,以获取类型DE,但是,我看不到当前措辞如何实现甚至不需要实现,因为绑定到派生类类型的基类类型的引用/指针将始终引用基类子对象。据我所知,永远不会发生表达式的类型和它所引用的对象的类型的情况。

R S*_*ahu 5

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

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

更新以回应评论

给定

struct foo { };
struct bar : foo { };
const foo& a = bar(); a;
Run Code Online (Sandbox Code Playgroud)

什么是动态类型a

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

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

的动态类型abar,不是foo

  • 闪回至命题逻辑101和实质意义。 (4认同)