文件编号 | 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 到任何类型,数字类型以扩展方式等)。
- 以向后兼容的方式更改现有接口,如果这些接口仅用于实例化类型和调用函数。实现细节(类型的主要名称、可调用函数的实现细节)不可依赖。