【问题标题】:How to understand "dynamic type: 〈prvalue〉 static type of the prvalue expression""如何理解“动态类型:<prvalue> prvalue 表达式的静态类型””
【发布时间】:2017-11-12 00:58:54
【问题描述】:

[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的动态和静态类型总是一样的?

【问题讨论】:

  • 您对其中的哪一部分有理解困难?
  • 看看这是否有帮助:Object slicing
  • @Yakk 谢谢你的课,我已经更新了我的问题。

标签: c++


【解决方案1】:

3.9和3.10有什么关系

它们都定义了“动态类型”。通俗地说,表达式的动态类型是包含表达式所指对象的完整对象的类型。

为什么强调prvalue?

也许为了清楚起见,他们决定分别解释“动态类型”对于泛左值和纯右值的含义。哲学(在 C++17 之前)是,glvalue 是 引用一个对象或函数的东西,而 prvalue 是 一个对象的值,所以它们有点天性不同。

是不是说prvalue的动态和静态类型总是一样的?

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

【讨论】:

    【解决方案2】:

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

    文档使用了稍微不寻常的格式。这两个部分应视为独立的定义,没有重叠。 (所有表达式要么是泛左值要么是纯右值,但不能同时是两者)。

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 2012-05-11
      • 2010-12-02
      • 2012-07-11
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多