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
,以获取类型D
从E
,但是,我看不到当前措辞如何实现甚至不需要实现,因为绑定到派生类类型的基类类型的引用/指针将始终引用基类子对象。据我所知,永远不会发生表达式的类型和它所引用的对象的类型的情况。
如果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
”。参考文献的处理方式相似。-?示例示例 ]
的动态类型a
是bar
,不是foo
。