【发布时间】:2016-04-02 13:57:30
【问题描述】:
在 C++ 中,它是 impossible to implement certain C++ standard library type traits,没有编译器内在函数,仅使用 C++ 语言。特征直接处理 C++ 类型。根据 §17.6.1.3.2,C++ 标准库的独立实现必须实现 <type_traits>。这是否实际上意味着 C++ 标准需要来自所有支持独立 C++ 标准库实现的编译器的非标准语言扩展/编译器内在函数?
为什么在没有核心语言支持的情况下允许将此类类型特征纳入标准?
【问题讨论】:
-
.. 因为它们至关重要?
-
C++ 标准要求“#include
”导致标准库特征被定义。这实际上是如何发生的,这取决于编译器。对于在任何地方都没有任何“type_traits”头文件的实现完全兼容,但让编译器硬编码此包含语句以以兼容的方式“激活”所有类型特征。 -
但是这有什么关系呢?为什么能够自己实现这些特征很重要?
-
核心语言和标准库是相互依赖的。例如。核心语言
typeid运算符依赖于标准库<typeinfo>标头,它是特定于实现的。 C 中的旧offsetof宏无法以可移植的方式实现。<type_traits>标头也是特定于实现的,但这不是问题。 -
只是为了回答“为什么”,实验类型的特征是 Boost 库的一部分。一些巧妙的特定于编译器的 hack,以及编译器嗅探,使得提供明显不可能实现的特征的大部分可移植版本成为可能。 Boost 实现证明了这些特征是可取的和可实现的。最好将它们放在标准库中。这可以在不扩展核心语言的情况下完成。对标准的最少添加量,仅采用(大部分)现有做法。
标签: c++ c++11 standards language-lawyer c++-standard-library