与基类子对象相关的表达式的动态类型
Dynamic type of an expression dealing with a base class subobject
我再次问这个问题,因为唯一的其他问题正在接近10年的历史,并且包含有关涉及基类次级对象的表达式的错误信息:
[defns.dynamic.type]将glvalue的动态类型定义为:
glvalue涉及最派生的对象的类型
glvalue最多是一个对象,并且由于[Into.Object] P6定义的"最派生的对象"本质上是:
完整的对象,数据成员或类类型的数组元素,或者,非类型类型的对象称为最派生的对象。
如果glvalue不参考最派生的对象,那么动态类型是否不确定?
另外,我知道表达式动态类型的预期效果是:对于glvalue表达式E
,它是指类型B
的对象,该对象是类型D
的对象的基类子对象,其中B
是基本D
类,要从E
获取D
类型,但是,由于当前的措辞如何完成甚至需要,因为绑定到派生类类型的基类类型的参考/指示器总是会引用基本类子对象。据我所知,一种表达式类型和所指对象的类型永远不会发生的情况。
如果glvalue不参考最派生的对象,那么动态类型会不确定吗?
总是这样做。因此,"然后"部分不适用。
响应评论
更新给定
struct foo { };
struct bar : foo { };
const foo& a = bar(); a;
a
的动态类型是什么?
答案在您在帖子中链接到的页面中找到:
[示例:如果指针
p
的静态类型为"指针到类B
",则指向D
类的对象,该对象来自B
,则表达式*p
的动态类型为"D
"。参考文献的处理方式类似。 - 结束示例]
a
的动态类型是bar
,而不是foo
。
我认为您可能会说这是一个措辞缺陷,但是这是ped的,因为意图已经很明确。而不是:
glvalue涉及最派生的对象的类型
您可能会想象定义读取:
glvalue引用对象的最派生对象的类型
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 内联映射初始化的动态atexit析构函数崩溃
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 使用正则表达式regex_search在字符串中查找字符串
- 控制允许动态运行c++的并发操作数
- 非类类型表达式的静态类型与动态类型之间的差异
- 与基类子对象相关的表达式的动态类型
- 如何理解"动态类型:〈prvalue〉静态类型的prvalue表达式PP_7
- 新表达式中的数组大小必须是常量(动态数组)
- 释放用户定义表达式析构函数中的动态内存
- 从置换的解析器表达式列表动态生成Spirit解析器表达式(在运行时)
- 动态分配正确对齐的内存:char数组上的新表达式是否合适
- 从配置文件中动态加载正则表达式模式