C ++ 17标准是否保证联合的地址与其成员的地址相同?

时间:2017-05-02 21:24:20

标签: c++ allocator

我目前正致力于编写池分配器。我的问题归结为以下代码:

template <typename T>
union myUnion {
    T data;
    myUnion<T>* nextUnion;
};

void someFunction(){
    myUnion<T> mu;
    T* t = new (std::addressof(mu.data)) T();
    //some code
    myUnion<T>* mu2 = reinterpret_cast<myUnion<T>*>(t);
}

mu的地址是否与mu2相同?

2 个答案:

答案 0 :(得分:18)

9.2 / 19(N4659中为12.2 / 24):

  

如果标准布局类对象具有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同。

如果联盟本身是标准布局,那么联合的地址与其成员的地址相同。

由于9.5 / 1(N4659为12.3 / 2),成员的地址完全相同:

  

每个非静态数据成员都被分配,就像它是a的唯一成员一样   结构。 union对象的所有非静态数据成员都具有相同的地址。

答案 1 :(得分:1)

询问两个对象是否具有相同的地址是不够的。例如,一个数组和它的第一个元素保证具有相同的地址,but you cannot cast one to the other

幸运的是,union 及其成员保证为 pointer-interconvertible,无论它们是否为标准布局。