【发布时间】:2019-11-10 17:51:00
【问题描述】:
我再次问这个问题是因为像这样的only other question 已经接近 10 年了,并且包含有关涉及基类子对象的表达式的错误信息:
[defns.dynamic.type] 将泛左值的动态类型定义为:
glvalue 所指的最衍生对象的类型
glvalue 最多只能引用一个对象,并且由于[intro.object] p6 定义的“最衍生对象”本质上是:
类类型的完整对象、数据成员或数组元素,或者非类类型的对象称为最派生对象。
如果glvalue 不引用最派生的对象,那么动态类型会是未定义的吗?
另外,我知道动态类型的表达式的预期效果是:对于泛泛值表达式E,它引用B 类型的对象,它是D 类型的对象的基类子对象,其中B 是D 的基类,要从E 获取类型D,但是,我看不到当前的措辞如何实现,甚至需要,因为base 的引用/指针绑定到派生类类型的类类型将始终引用基类子对象。据我所知,表达式的类型和它所引用的对象的类型永远不会发生。
【问题讨论】:
-
什么是“唯一的其他问题”?包含错误信息的问题很自然,那么答案呢?
-
@fore 答案不正确,他们声明对于这个 sn-p:
const T& a = U();引用绑定到类型为U的对象,实际上它绑定到基类子对象创建的临时对象的数量(假设U is derived fromT`) -
@KrystianS:“*当它实际上绑定到创建的临时对象的基类子对象时(假设
U派生自T)*”你能引用实际的位置吗是在标准中说的?因为这不是引用的工作方式。就标准而言,a是对U的引用,其类型为T。 -
@Nicol Bolas 见eel.is/c++draft/dcl.init.ref#5
-
你能添加一个链接到“唯一的其他问题”吗?
标签: c++ pointers language-lawyer lvalue subobject