为什么要将结构包装在匿名联合中? (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;
}
STL <memory>
header(MSVC 实现)包含一个名为:
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; }