为什么C++没有隐式生成或可声明为default的swap()函数?
这个特性至今未被纳入C++标准,主要来自设计兼容性、社区共识、优先级三个层面的原因,而非疏忽遗漏:
- 设计与兼容性障碍
C核心语言中默认生成的特殊成员函数均为类的非静态成员函数,而swap的通用约定是非成员友元函数,将非成员函数纳入默认生成体系需要大幅修改现有特殊成员的生成规则,打破了语言规则的一致性。
同时向后兼容性是核心阻碍:现有大量代码依赖std::swap<T>默认调用移动构造、移动赋值的行为,如果编译器新增隐式生成swap的逻辑,会改变大量现有代码的执行路径,甚至引发ADL查找的二义性,不符合C标准“不破坏现有有效代码”的核心原则。 - 异常保证的共识冲突
你提到的默认生成swap的异常规则逻辑自洽,但和社区长期以来对swap的强异常保证预期存在冲突:传统自定义swap基本都会保证“要么交换完成,要么两个对象状态不变”,而逐成员调用子对象swap的默认实现如果中途抛出异常,会导致对象处于半交换的中间状态。虽然移动构造、移动赋值也存在同样的问题,但社区对swap的可靠性预期远高于普通移动操作,这一差异也引发了大量反对意见。 - 优先级与替代方案的存在
近几个版本的C标准优先级集中在概念、协程、模块、范围库、编译期反射等重量级特性上,默认生成swap属于边际收益有限的小特性:绝大多数场景下std::swap基于移动操作的实现性能够用,少数需要优化的场景也可以通过自定义代码、宏生成等方式解决,需求强度不足以让委员会分配精力优先处理。
另外即将进入C26的编译期反射特性,将允许用户通过库代码实现自动遍历基类、成员生成swap的逻辑,不需要修改核心语言规则即可满足需求,也进一步降低了这一特性的优先级。
内容的提问来源于stack exchange,提问作者vedg
相关产品推荐
相关产品推荐

