如何理解“动态类型:?纯右值?纯右值表达式的静态类型””

陳 力*_*陳 力 1 c++

[N4687]

3.9 [defns.dynamic.type]

动态类型

?左值?泛左值所指的最派生对象 (4.5) 的类型 [示例:如果静态类型为“指向类 B 的指针”的指针 (11.3.1) p 指向类 D 的对象,该对象派生自 B(条款13),表达式*p的动态类型为“D”。参考文献 (11.3.2) 的处理方式类似。— 结束示例 ]

3.10 [defns.dynamic.type.prvalue]

动态类型

?价值?纯右值表达式的静态类型

3.9 上关于动态类型混凝土的大多数问题。但我仍然无法理解3.10的含义。

这是cppreference的描述:

纯右值不能是多态的:它标识的对象的动态类型始终是表达式的类型。

更新:

3.9 告诉我动态类型意味着必须在运行时延迟类型的确定。

我有几个关于3.10的问题:

  1. 3.9和3.10有什么关系

  2. 为什么强调纯右值?

  3. 这是否意味着纯右值的动态和静态类型始终相同?

Bri*_*ian 5

3.9和3.10有什么关系

它们都定义了“动态类型”。非正式地,表达式的动态类型是包含表达式所表示的对象的完整对象的类型。

为什么强调纯右值?

或许为了清楚起见,他们决定分别解释“动态类型”对于左值和右值的含义。哲学(在 C++17 之前)是泛左值是对象或函数的东西,而纯右是对象的,因此它们本质上有些不同。

这是否意味着纯右值的动态和静态类型始终相同?

是的。虽然可以创建引用另一个对象的基类子对象的泛左值,但纯右值不引用任何内容,因此,它就是这样。任何创建作为另一个对象的子对象的纯右值的尝试只会创建该子对象的副本,而该副本是一个完整的对象。