如何(以及谁可以)实现 C++ 委员会定义的标准库功能?

How to (and who can) implement the standard library features defined by the C++ committee?

当 C++ 委员会发布将成为该语言的下一个标准中标准库的一部分的新功能时,他们是否也会发布一些源代码或某种关于如何实现该功能的指南?

我们以unique_ptr为例。语言委员会只是为那个 class 模板定义了一个接口,让编译器供应商随意实现它?这个标准库特性的实现过程究竟是如何发生的?

任何人都可以为尚不支持标准库的平台实现部分标准库吗?假设我想实现 C++ 标准库的一些很酷的功能,以便在微控制器环境中使用它。我怎么能那样做?我应该在哪里寻找信息?如果我决定开源我的项目,我可以这样做吗?我是否需要完全遵循标准所说的内容,或者我可以编写一个不合规的版本?

正式地,没有。与现有的所有标准一样,C++ 标准制定规则,但不提供实现。然而,从实际的角度来看,几乎不可能在没有提议实现的情况下将新功能引入标准库,因此您经常可以找到附加在提议中的内容。

至于你在"can you write non-compliant version"上的问题,你可以随心所欲。采用可能取决于您的合规性,也可能不取决于您的合规性 - 众所周知,超级广泛采用的 MSVC 违反了 C++ 标准。

通常情况下,新功能是不标准化的,除非委员会有确凿的证据表明它可以实施并且很有用。这通常包括 boost 中的原型实现、GNU 库或商业编译器供应商之一。

标准 本身 不包含任何实施指南 - 它纯粹是一个规范。编译器供应商(或其分包商)选择如何实现该规范。

unique_ptr 的特定情况下,它从 boost::unique_ptr 被采纳到标准中 - 您仍然可以使用后者。如果您有一个编译器可以为您的微控制器编译,几乎可以肯定它将能够构建足够的提升以使 unique_ptr 工作。

没有什么能阻止您编写不符合标准的实现(除了一个微不足道的问题,即如果您将其作为符合标准的标准出售,而事实并非如此,您可能会收到当地的交易标准等价物.)

委员会不发布任何参考实现。在早期,事情变得标准化,然后工具开发人员离开并实施标准。这已经改变,现在委员会寻找在标准化之前已经实施和测试的功能。

此外,重大开发通常不会直接进入标准。首先,它们成为 experimental features 称为技术规范或 TS。这些 TS 可能会在以后纳入主要标准。

您可以自由编写自己的 C++ 标准库实现。 Plum Hall 有一个测试套件(商业的,我没有联系,但 Plum Hall 非常参与 C++ 标准化)。

我看不出有任何不合规的问题。几乎所有的实现都有一些扩展。只是不要做出任何虚假声明,尤其是如果您想销售您的产品。

如果您有兴趣参与,可以通过 'National Body'(美国的 ANSI,英国的 BSI 等)完成。 isocpp 网站有一个关于标准化的部分,这将是一个很好的起点。

通常,

  • 每个新的库功能都经过 proposal

  • 如果提案提交给 C++ 委员会的 库演化工作组 ,它会经历一系列迭代("tough ground" 作为我我知道)。

  • 它经历了描述的一系列细化过程here

  • 如果它需要 (TS) 技术规范 (C++11 起),它会去那里烘焙。例如,#include <filesystem> 在 C++17 之前的 文件系统 TS 中。

  • 我认为委员会喜欢的一件事是 实施经验

  • 可以在 ISOCpp site

  • 上找到更多信息

嗯,关于实现:

  • 有相当多的"library features"不能纯粹作为一个库来实现。他们需要编译器支持。在这些情况下,编译器提供了 "intrinsic" 你可以挂钩。例如,clang 提供 intrinsics for certain type_traits

  • 大多数库功能都有一些实现经验,大部分来自 Boost libraries.

  • 您实际上可以查看编译器附带的默认标准库的源代码:

  • 可悲的是,大多数实现都使用了一大堆下划线。主要是因为它们保留供 "Standard Library".

  • 使用

Can anyone implement parts of the standard library for a platform that doesn't have support for it yet?

是的,你可以,到目前为止你的编译器支持该平台,并且该平台或操作系统提供可用 API。例如。 std::coutstd::ifstream 的元素,还有更多需要特定平台的支持。

Let say I would like to implement some cool features of the C++ standard library to use it on a microcontroller environment. How could I do that?

您可以查看其他人的代码并从那里开始。我们向巨人学习。一些开源示例:

How could I do that? Where should I look for information?

  • 您可以查看将此功能引入 C++ 库的论文。例如,std::optional 有一个独立的实现 here,在提案阶段用作参考实现。

  • 你可以查一下标准库,好好学习一下。 :-)

  • 上网搜索。 :-)
  • 或者按标准从头开始写

Will I need to follow exactly what the standard say or I can write a non-compliant version?

没有强制遵循 C++ 标准库指定的内容。那将是您的 "own" 图书馆。