如何理解"动态类型:〈prvalue〉静态类型的prvalue表达式PP_7
How to understand "dynamic type: 〈prvalue〉 static type of the prvalue expression""
[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的问题:
-
3.9和3.10 之间的关系是什么
-
为什么强调prvalue?
-
这是否意味着prvalue的动态和静态类型总是相同的?
3.9和3.10 之间的关系
它们都定义了"动态类型"。非正式地说,表达式的动态类型是包含该表达式表示的对象的完整对象的类型。
为什么强调prvalue?
也许为了清楚起见,他们决定分别解释"动态类型"对glvalues和prvalues的含义。哲学(在C++17之前)是,glvalue是指一个对象或函数的东西,而prvalue是对象的值,所以它们本质上有些不同。
这是否意味着prvalue的动态和静态类型始终相同?
是。虽然可以创建一个引用另一个对象的基类子对象的glvalue,但prvalue并不引用任何东西,因此它就是这样。任何试图创建另一对象的子对象prvalue的尝试都只会创建子对象的副本,而该副本就是一个完整的对象。
3.9定义了"glvalue的动态类型",3.10定义了"prvalue的动态型"。
该文档使用了稍微不寻常的格式。这两个部分应被视为单独的定义,没有重叠。(所有表达式都是glvalues或prvalues,但不能同时为二者)。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 我们如何测试是否可以使用 prvalue 调用某种类型的表达式
- 将非类非数组 prvalue 转换为符合 cv 条件的类型是否合法?
- 如何理解"动态类型:〈prvalue〉静态类型的prvalue表达式PP_7