【发布时间】:2021-10-27 16:50:18
【问题描述】:
在 C++ ISO 草案 2020 文档编号 4849 中搜索术语“成员子对象”返回 7 个结果。全部抄录如下;
(6.7.2 对象模型):
对象可以包含其他对象,称为子对象。子对象可以 是成员子对象 (11.4)、基类子对象 (11.7) 或 数组元素。不是任何其他对象的子对象的对象 称为完整对象。如果在存储中创建对象 与 成员子对象 或数组元素 e 相关联(可能或 可能不在其生命周期内),创建的对象是 e 包含对象 if:...
(6.7.3 生命周期)
[注:11.10.2 描述了基础和成员子对象的生命周期。 — 尾注]
(9.9 using 声明)
[注意:因为 using-declarator 指定基类成员(和 不是成员子对象或基类的成员函数 子对象),不能使用 using-declarator 来解析继承 成员歧义
(11.4 班级成员)
[注意:非引用类型的非静态数据成员是成员 类对象 (6.7.2) 的子对象。 ——尾注]
(11.8 成员名称查找)
[注意:静态成员、嵌套类型或枚举器定义在 基类 T 可以明确地找到,即使一个对象有更多 多于一个 T 类型的基类子对象。两个基类子对象 共享其公共虚拟基础的非静态成员子对象 类。 ——尾注]
(11.10.2 初始化基和成员)
注意:声明顺序是为了确保基础和成员 子对象 以与初始化相反的顺序被销毁。 - 结尾 注意]
对我来说,似乎没有一个是该术语的定义。上面的 Class Member 声明说了一些有趣的事情,但它没有说“只有非引用类型的非静态数据成员是成员子对象”。那么什么是成员子对象呢?
【问题讨论】:
-
上面的 Class Member 声明说了一些有趣的事情 但并不完全正确。 NSDM 不是子对象,就像变量不是对象一样。甚至认为在某些情况下它们之间存在关联。
-
我应该放弃这个学期吗?看起来太乱了
-
我认为 @LanguageLawyer 的区别在于,如果您有一个 NSDM
int x是“成员”但不是“成员子对象” -
@CoryKramer 是的,NSDM 基本上可以通过名称查找来声明或找到。
int xinstruct S { int x; };声明 NSDM,S::x表示(在查找的意义上,而不是在[basic.lval]/1 的意义上)NSDM 等。但是这里没有成员子对象。成员子对象是一个“事物”,可以对应于类成员访问表达式中的 NSDM。S{}.x表示(或指定,在 [basic.lva]/1 意义上)从S{}创建的临时对象的成员子对象,对应于S::xNSDM。 -
你能否展示一些 C++ 代码,其中不清楚某事物是否是成员子对象?
标签: c++ object language-lawyer