我再次问这个问题,因为像这样的only other question已有10年历史了,其中包含有关涉及基类子对象的表达式的错误信息:
[defns.dynamic.type]将glvalue的动态类型定义为:
glvalue所引用的最派生对象的类型
glvalue最多只能引用一个对象,并且由于[intro.object] p6定义的“最派生对象”实质上是:
一个完整的对象,一个数据成员或一个类类型的数组元素,或一个非类类型的对象被称为“最派生对象”。
如果glvalue不引用最派生的对象,那么动态类型会不确定吗?
此外,我知道表达式的动态类型的预期效果是:对于glvalue表达式E
,它引用类型为B
的对象,该对象是对象的基类子对象类型D
,其中B
是D
的基类,以便从D
获得类型E
,但是,我看不出当前的措辞如何完成或什至需要这样做,因为绑定到派生类类型的基类类型的引用/指针将始终引用基类子对象。据我所知,永远不会发生表达式的类型和它所引用的对象的类型的情况。
答案 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所引用对象的最派生对象的类型