如何理解"动态类型:〈prvalue〉静态类型的prvalue表达式PP_7

How to understand "dynamic type: 〈prvalue〉 static type of the prvalue expression""

本文关键字:类型 prvalue 静态类 表达式 PP 静态 何理解 动态      更新时间:2023-10-16

[N4687]

3.9[defns.dynamic.type]

动态类型

glvalue所指的最派生对象(4.5)的类型[示例:如果静态类型为"B类指针"的指针(11.3.1)p指向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的问题:

  1. 3.9和3.10 之间的关系是什么

  2. 为什么强调prvalue?

  3. 这是否意味着prvalue的动态和静态类型总是相同的?

3.9和3.10 之间的关系

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

为什么强调prvalue?

也许为了清楚起见,他们决定分别解释"动态类型"对glvalues和prvalues的含义。哲学(在C++17之前)是,glvalue是一个对象或函数的东西,而prvalue是对象的值,所以它们本质上有些不同。

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

是。虽然可以创建一个引用另一个对象的基类子对象的glvalue,但prvalue并不引用任何东西,因此它就是这样。任何试图创建另一对象的子对象prvalue的尝试都只会创建子对象的副本,而该副本就是一个完整的对象。

3.9定义了"glvalue的动态类型",3.10定义了"prvalue的动态型"。

该文档使用了稍微不寻常的格式。这两个部分应被视为单独的定义,没有重叠。(所有表达式都是glvalues或prvalues,但不能同时为二者)。