0

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

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

泛左值所指的最衍生对象的类型

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

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

如果glvalue 没有引用一个最派生的对象,那么动态类型会是未定义的吗?

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

4

2 回答 2

5

如果glvalue 没有引用一个最派生的对象,那么动态类型会是未定义的吗?

它总是这样。因此,“then”部分不适用。

更新以回应评论

给定

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

什么是动态类型a

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

[ <em>示例:如果p静态类型为“指向类的指针”B的指针指向类的对象D,从 派生B,则表达式的动态类型*p为“<code>D”。参考文献的处理方式类似。—结束示例 ]

的动态类型abar,不是foo

于 2019-06-28T20:01:29.160 回答
3

我认为您可能会争辩说这是一个措辞缺陷,但这将是迂腐的,因为意图已经很清楚了。代替:

泛左值所指的最衍生对象的类型

您可能会想象定义如下:

泛左值所指对象的最派生对象的类型

于 2019-06-28T20:19:08.397 回答