指向匿名联合成员的指针是否相等?

Are pointers to members of an anonymous union equal?

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。

您的地址检查定义明确 () and the standard guarantees that all members shall have the same address (cfr. [class.union]/3)。

您一定是偶然发现了一个现已修复的编译器错误。