你能否拥有一个指向联合体成员的“成员指针”?

5

所有我能找到的描述都是在类的上下文中谈论“成员指针”。联合体与结构非常相似,并且特别具有成员。您是否也可以有指向这些成员的指针?

例如:

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

我不是在谈论指向整个联合体的指针,而是指向联合体成员的指针等。上面示例中的p实际上将是一个偏移量,大小显然为0。 我需要这个结构来回答这个问题


1
联合体(Unions)类(Classes)(§9/5),所以我猜“是”。 - R. Martinho Fernandes
1
那段代码编译通过了,所以我认为是的。 - Andy Prowl
1
我不确定你为什么想要它。但是,你可以将&x强制转换为int *来访问a,而无需知道它的名称。 - user743382
2
你打算将那些成员指针用作模板参数吗? :-) - Kerrek SB
是的 - 联合 PTM 真的是非常退化的东西:它们都有相同的值,它们唯一的目的是静态的,也就是说,它们是他们的 类型。这反映了一个事实,即具有相同类型的联合成员多于一个是没有意义的。(想一想,法国。) - Kerrek SB
显示剩余2条评论
1个回答

5

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

§8.3.3/1: 在声明T D的情况下,其中D具有形式…和nested-name-specifier表示一个类,…

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

当然还有§9.5/5:一个union是用类关键字union定义的类...

(§3.9.2/1还提到了:unions,它们是类……)

没有提到该类不能是联合体,所以可以构造这样的PTM类型和值。


哦,我在想这些对象之间平等是如何定义的。它们是否都与 nullptr 相等比较? - Potatoswatter
一个指向结构体第一个成员的指针,即使其偏移量为0,也不等于nullptr。一个指向联合体成员的指针也不应该相等。 - user743382
根据GCC的说法,它们彼此相等但不为零。 - Potatoswatter
@hvd 偏移量不必参与其中。根本没有任何替代值,甚至无法询问偏移量是多少。但是,似乎GCC仍然实现并使用了偏移量,因此取消引用PTM null联合会导致奇怪的UB。 - Potatoswatter
你可以拥有&x::anullptr这两个不同的值。:) 而且nullptr被实现为魔术不可能的偏移值(-1,如果我没记错的话),所以在GCC中偏移量是相关的。 - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接