【问题标题】:Why is there no language support in C++ for all C++ standard library type traits?为什么 C++ 中没有对所有 C++ 标准库类型特征的语言支持?
【发布时间】: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


【解决方案1】:

C++ 标准库的许多方面无法在没有编译器支持的情况下实现。例如,type_info。 “独立 C++ 库”实现无法提供这种类型,因为它是基于关键字的表达式的结果:typeid。唯一可以提供这种东西的人是编译器编写者,因为编译器是必须生成这些对象的人。

标准库的许多其他元素也是如此。 exception_ptrcurrent_exception(s)initializer_list 等。在 C++ 标准中有整整一章的内容。

并非所有标准库的组件都可以在没有编译器支持的情况下实现。类型特征只是独立 C++ 库无法实现的另一件事。不在 ISO 标准 C++ 中。

至于为什么他们没有提供实现它们所需的工具?因为那会花费更多的时间。请注意,反射甚至还不是一个完整的 TS,而 type-traits 已经成为标准 5 年了。

很难指定反射等通用工具。确切地知道您需要什么行为以及应该如何提供它。查看常见的使用模式(如 Boost 示例)并使用它们要容易得多。类型特征是反思的唾手可得的果实。

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2014-06-28
    • 2017-07-31
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多