C++ 标准定义了泛左值的概念“动态类型”,如下所示:
动态型
<glvalue> 由glvalue 表达式表示的glvalue 所指的最衍生对象(1.8)的类型[示例:如果静态类型为“指向B 类的指针”的指针(8.3.1)p 指向的对象为D 类,派生自 B(第 10 条),表达式 *p 的动态类型是“D”。参考文献(8.3.2)的处理方式类似。—结束示例]
如果泛左值所指的不是最衍生的对象,如何解释这个定义?这是否意味着“包含由glvalue表达式表示的glvalue所指的对象的最派生对象的类型”?
另一个难题是关于 C++ 标准 5.7 中的第 4 段:
...如果指针操作数指向数组对象的元素,...
我想问如果指针操作数指向数组对象元素的子对象,这个条件是否成立。举个例子,如果它不成立,那么下面代码中的行为是未定义的,对吧?
D d[10];
B *p = d; //B is a base class of D
p += 2; //undefined behavior?