SD-8:标准库兼容性

文件编号 SD-8
日期 2020-03-08
回复给 Bryce Lelbach

标准库兼容性

对于足够聪明的用户来说,我们对标准库所做的任何更改实际上都将是破坏性更改。在少数情况下,标准本身明确规定了用户不允许做什么(“不要获取标准类型成员函数的地址”、“不要向命名空间 std 添加新名称”)——这些限制并未被广泛理解,不完整,并且完全不清楚这些规则为何存在。为了与关于兼容性的一般讨论保持一致,并如 P0684 中所述,我们应该向用户明确什么构成 C++ 标准库的受支持用法,什么不构成。委员会保留哪些权利以便将来对标准库进行更改?

特别注意,标准用户在这方面并非特殊:滥用这些规则对于大多数库来说通常都是不良用法。

标准库为自身保留的权利

首先,标准保留以下权利:

  • 向命名空间 std、为未来标准化保留的任何命名空间(例如 std2;详见 [namespace.future]),以及这些命名空间的任何子命名空间添加新名称。
  • 向任何保留命名空间内的任何实体添加新名称,包括但不限于:
    o 函数(这包括新的成员函数和现有函数的重载)
    o 枚举
    o 命名空间
    o 别名(using、typedef 等)
    o 类(struct/class/union)
    o 概念
    o 变量
  • 为函数和模板添加新的默认参数
  • 以兼容方式更改函数的返回类型(void 到任何类型,数字类型以扩展方式等)。
  • 以向后兼容的方式更改现有接口,如果这些接口仅用于实例化类型和调用函数。实现细节(类型的主要名称、可调用函数的实现细节)不可依赖。