如何理解&#34;动态类型:<prvalue> prvalue表达式的静态类型&#34;&#34;

时间:2017-11-12 00:58:54

标签: c++

[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的问题:

  1. 3.9和3.10之间的关系

  2. 为什么强调prvalue?

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

2 个答案:

答案 0 :(得分:3)

  

3.9和3.10之间的关系

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

  

为什么强调prvalue?

也许为了清楚起见,他们决定分别解释“动态类型”对于glvalues和prvalues的意义。哲学(在C ++ 17之前)是glvalue是引用对象或函数的东西,而prvalue是对象的值,所以它们有点简单地按性质不同。

  

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

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

答案 1 :(得分:1)

3.9定义&#34; glvalue&#34;的动态类型,3.10定义&#34; prvalue&#34;的动态类型。

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