[N4687]
3.9 [defns.dynamic.type]
动态类型
glvalue引用的最派生对象(4.5)的类型 [示例:如果指针(11.3.1)p的静态类型是“指向B类的指针”,则指向D类对象, 从B(第13条)得出,表达式* p的动态类型是“D”。参考文献(11.3.2)被处理 与此类似。 - 结束例子] 3.10 [defns.dynamic.type.prvalue]
动态类型
prvalue表达式的静态类型
3.9关于动态型混凝土的大多数问题。 但我仍然无法理解3.10的含义。
以下是cppreference的说明:
prvalue不能是多态的:它识别的对象的动态类型始终是表达式的类型。
3.9告诉我动态类型意味着类型的确定必须在运行时延迟。
我有几个关于3.10的问题:
3.9和3.10之间的关系
为什么强调prvalue?
这是否意味着prvalue的动态和静态类型始终相同?
答案 0 :(得分:3)
3.9和3.10之间的关系
他们都定义了“动态类型”。非正式地,表达式的动态类型是包含表达式表示的对象的完整对象的类型。
为什么强调prvalue?
也许为了清楚起见,他们决定分别解释“动态类型”对于glvalues和prvalues的意义。哲学(在C ++ 17之前)是glvalue是引用对象或函数的东西,而prvalue是对象的值,所以它们有点简单地按性质不同。
这是否意味着prvalue的动态和静态类型始终相同?
是。虽然可以创建一个引用另一个对象的基类子对象的glvalue,但是prvalue并不引用任何东西,因此它就是它。任何尝试创建另一个对象的子对象的prvalue只会创建一个子对象的副本,而该副本是一个完整的对象。
答案 1 :(得分:1)
3.9定义" glvalue"的动态类型,3.10定义" prvalue"的动态类型。
该文档使用稍有异常的格式。这两部分应作为单独的定义,没有重叠。 (所有表达式都是glvalues或prvalues,但不能同时使用两者。)