我看到一些代码如下:
class A
{
private:
union {
B *rep;
A *next;
}; // no variables of this anonymous defined!
void func()
{
A *p = new A;
p->next = NULL; // why p has a member variable of 'next'?
}
};
Run Code Online (Sandbox Code Playgroud)
我用VS2010编译了上面的代码没有任何错误.这是问题,
为什么p有成员变量'next'?
union {
B *rep;
A *next;
};
Run Code Online (Sandbox Code Playgroud)
据我所知,这是一个匿名联盟,甚至没有定义变量.我们如何才能像这样访问这个联合中的成员变量?
Jon*_*nna 20
因为这几乎就是匿名联合的作用,它在封闭命名空间(在类声明中使它们成为字段名称)中定义了零或多个变量,这些变量占用了重叠的内存.因此,在使用它时,就像你宣布的一样
class A
{
private:
B *rep;
A *next;
void func()
{
A *p = new A;
p->next = NULL;
}
};
Run Code Online (Sandbox Code Playgroud)
...除了rep和next占用重叠空间(或者假设两个指针具有相同的大小,相同的空间),因此命名联合带来的所有危险和好处.
Ben*_*igt 13
以下是控制此行为的标准引用:section [class.union](C++ 0x draft n3242中的措辞)
表单
union {成员规范} ;的联合称为匿名联合; 它定义了一个未命名类型的未命名对象.匿名联合的成员规范应仅定义非静态数据成员.[注意:嵌套类型和函数不能在匿名联合中声明. - 尾注]匿名工会成员的名称应与宣布匿名工会的范围内的任何其他实体的名称不同.出于名称查找的目的,在匿名联合定义之后,匿名联合的成员被认为是在声明匿名联合的范围内定义的.