【问题标题】:Can you have a "pointer to member" to a member of a union?你能有一个指向工会成员的“成员指针”吗?
【发布时间】:2013-01-17 09:35:09
【问题描述】:

我能找到的所有描述都在类的上下文中谈论“指向成员的指针”。工会与结构非常相似,特别是也有成员。你也可以给那些成员一个指针吗?

例如

union x {
    int a;
    float b;
};
int x::*p = &x::a;

我不是在谈论指向整个联合的指针,作为联合成员的指针等。上面示例中的 p 确实是一个偏移量,显然大小为 0。我需要这个构造回复this question

【问题讨论】:

  • 联合类(§9/5),所以我猜“是”。
  • 该代码可以编译,所以我认为是的
  • 我不知道你为什么想要它。您可以将&x 转换为int * 以访问a,而无需知道其名称。
  • 根据标准,联合是类 类型,所以是的,只要它们不是位域成员,您就应该清楚。
  • 你打算使用那些成员指针作为模板参数吗?:-)

标签: c++


【解决方案1】:

§3.9.2/1:复合类型可以通过以下方式构造:……指向非静态 50 个类成员的指针,它们标识给定类的对象中给定类型的成员,

第 8.3.3/1 节:在声明 T D 中,其中 D 的形式为 ... 并且 nested-name-specifier 表示一个类,...

§5.3.1/3:一元& 运算符的结果是指向其操作数的指针。操作数应为左值或qualified-id。如果操作数是一个 qualified-id 命名某个类 C 的非静态成员 m 类型为 T,则结果类型为“指向类型 T 的类 C 的成员的指针”并且是一个prvalue,指定C::m

当然还有 §9.5/5:union 是使用类键 union... 定义的类。

(第 3.9.2/1 节还提到:联合,它们是类……)

没有提到类不能是联合,所以是的,你可以形成这样的 PTM 类型和值。

【讨论】:

  • 嗯,我想知道这些对象之间的相等性是如何定义的。它们是否都等于nullptr
  • 指向结构第一个成员的指针不等于 nullptr,即使它的偏移量为 0。指向联合成员的指针也不应该。
  • ... 根据 GCC,它们彼此相等,但不为零。
  • @hvd 偏移量不必输入。根本没有替代值,甚至没有可能询问偏移量是什么。但是,GCC 似乎无论如何都实现并使用了偏移量,因此取消引用 union PTM null 会导致 UB 不稳定。
  • 您的值可以是&x::anullptr。这是两个截然不同的价值观。 :) 并且nullptr 被实现为一个神奇的不可能偏移值(-1,IIRC),因此偏移与 GCC 相关。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 2018-03-24
  • 1970-01-01
  • 2011-05-17
  • 2021-12-03
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多