【问题标题】:How does the std::is_union implementation work?std::is_union 实现如何工作?
【发布时间】: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


【解决方案1】:

并非所有标准库都可以用 C++ 实现。

您跳过了各种内在函数的测试。

本质上,没有内在函数就无法实现is_union

std不是 C++ 附带的库,它是该语言的一部分。 #include &lt;vector&gt; 允许某些代码工作;不需要存在vector 标头,只需在指令后更改C++ 程序的状态即可。

在实践中(通过设计),它是在内部函数的帮助下作为相对传统的库在 C++ 中编写和实现的,并使用保留标记编写以避免预处理器冲突(例如,___Ty 变量名)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2017-11-29
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2021-05-17
    • 2017-11-16
    • 2018-08-04
    相关资源
    最近更新 更多