【问题标题】:What is a member sub object?什么是成员子对象?
【发布时间】: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 x in struct S { int x; }; 声明 NSDM,S::x 表示(在查找的意义上,而不是在[basic.lval]/1 的意义上)NSDM 等。但是这里没有成员子对象。成员子对象是一个“事物”,可以对应于类成员访问表达式中的 NSDM。 S{}.x 表示(或指定,在 [basic.lva]/1 意义上)从 S{} 创建的临时对象的成员子对象,对应于 S::x NSDM。
  • 你能否展示一些 C++ 代码,其中不清楚某事物是否是成员子对象?

标签: c++ object language-lawyer


【解决方案1】:

这是一个例子

struct A {
};

struct B {
    A a;
}

int main()
{
    A x;
    B y;
}

在这种情况下,xA 类型的“完整对象”,而y.a 也是A 类型,它是y 类型的“成员子对象”@ 987654327@.

【讨论】:

  • 我在想这样的事情。但是如果结构 B 是从 A 派生的,会发生什么?它将在 B 中存在一个类型为 A 的未命名对象,该对象将是基类子对象。所以A a 将是一个成员子对象,而未命名的A 不是?
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2021-12-12
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多