C ++ 11允许在函数中定义匿名联合,并且可以将其成员作为函数的变量进行访问。如果我检查指向不同成员的指针,它们是相同的,但==
运算符表示它们不相等。
这种奇怪的行为通常是未定义行为的结果,但我在代码中看不到任何未定义的内容(我确保两个成员属于同一类型)。
如果我使用未命名联合类型的命名变量,则行为会有所不同。在这种情况下,指针比较相等。
该程序演示了两种情况:
#include <iostream>
using namespace std;
#ifdef NAMED
// Create a named object of a union type
#define NAME n
#define ADDR(mem) &(NAME.mem)
#else
// Create an anonymous union in main()
#define NAME
#define ADDR(mem) &mem
#endif
int main()
{
union {
int a;
int b;
} NAME;
cout << "&a = " << ADDR(a) << endl;
cout << "&b = " << ADDR(b) << endl;
cout << "(&a==&b) = " << (ADDR(a) == ADDR(b)) << endl;
return 0;
}
使用-DNAMED
编译时,它会打印到相同的指针和1(相等的指针)。没有-DNAMED
,它再次打印相同的指针,然后是0(不等指针)。
使用g ++ 5.4.0,Ubuntu 16.04,x86_64进行测试。
答案 0 :(得分:3)
您的地址检查已明确定义(as YSC pointed out),并且标准保证所有成员都具有相同的地址(cfr。[class.union]/3)。
你必须偶然发现一个现在已修复的编译器错误。