为什么要将结构包装在匿名联合中? (STL msvc 实现)

Why would one wrap a struct in an anonymous union? (STL msvc implementation)

STL <memory> header(MSVC 实现)包含一个名为:

的 class
template <class _Ty> class _Ref_count_obj2 : public _Ref_count_base

这个class有一个成员:

union {
    _Wrap<_Ty> _Storage;
};

其中 _Wrap 定义为:

template <class _Ty> 
struct _Wrap {
    _Ty _Value; // workaround for "T^ is not allowed in a union"
};

根据我的理解,此代码旨在通过 new 运算符在构造后保存 _Ty 类型的 object。但是我不明白为什么要这样做;似乎在 union 中使用 struct 而不是 struct 也可以。

谁能解释一下这背后的原因?另外,谁能解释一下 _Wrap 定义中的注释?

首先,将 _Storage 成员嵌入 union 将防止该对象的默认销毁(这很可能是 非平凡的 类型);这似乎是必不可少的,因为所涉及的 class 是一个引用计数器。 (默认情况下,联合有一个已删除的析构函数;参见,例如:。)

其次,使用 anonymous union 'moves' _Storage 标识符进入封闭范围,从而消除对 [=14 的任何需要=] 风格的符号(如果联合被命名为 X)。来自 cppreference:

Members of an anonymous union are injected in the enclosing scope (and must not conflict with other names declared there).

最后,需要将 union 的成员包装到模板结构中,这样 class 就可以使用引用类型,这在 union 中是不允许的。要检查最后一部分,请尝试使用以下代码并激活注释掉的行:

template <class _Ty>
struct _Wrap {
    _Ty _Value; // workaround for "T^ is not allowed in a union"
};

template<class T>
class bob {
public:
    bob(T t) : uncle{t}//, aunty(t)
    {
    }
private:
    union {
        _Wrap<T> uncle;
    };
//    union {
//        T aunty;
//    };
};

int main()
{
    int i = 42;
    bob<int&> b{ i }; // Note: Template uses a REFERENCE type
    return 0;
}