【发布时间】:2021-07-21 22:37:52
【问题描述】:
我目前正在更详细地浏览 C++ 标准库,我想知道std::is_union 的实现是如何工作的。在libcxx(LLVM)中,除了直接使用可能内置的__is_union外,还定义为
template <class _Tp> struct __libcpp_union : public false_type {};
template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_union
: public __libcpp_union<typename remove_cv<_Tp>::type> {};
类似地,STLPort,虽然很老,但实现起来更加简约:
template <class T>
struct is_union
{ };
这似乎总是解析为std::false_type,或者更糟糕的是,一个空结构,但它没有;这是如何实现的?
在另一个问题中,一个答案指出 is_union can't be implemented without compiler hooks,但这是否意味着 libcxx、STLPort 以及可能所有主要实现都不能移植到任何不能自动使其工作的编译器?
【问题讨论】:
-
你不应该混合和匹配编译器和标准库;它们应该是一个匹配的集合。
-
您没有展示这些库中的任何一个的完整实现。他们都有
#ifdefs 检查编译器内在函数。 -
STLPort 是 10 年前的东西,据我所知。实际上有这个的当前版本吗?由于所有主要编译器都支持 STL,它基本上已经过时了。
-
如果编译器声称与 C++11 兼容,那么编译器供应商有责任提供
std::is_union。否则,许多程序员会认为编译器坏了(如果供应商说它支持 C++ 11),或者只是不是 C++11 编译器(可能是 C++03 或 98),
标签: c++ language-implementation