std::swap重载常规实现原理及内置类型成员场景的写法疑问
结论
你给出的直接显式调用std::swap的实现,针对当前成员全为内置类型、指针类型的S结构体是完全合法合规、功能等价的,不存在错误。
为什么普遍仍推荐using std::swap;的惯用法
哪怕成员都是内置类型,社区仍然普遍推荐统一使用ADL惯用法实现swap,主要出于两个工程层面的考虑:
- 可维护性优先:如果后续你修改了
S的成员定义,比如将int a替换为某个自定义命名空间下的类类型、将char* b替换为自定义字符串类,直接写std::swap将无法触发ADL匹配对应类型的自定义swap重载,可能导致性能下降甚至逻辑不符合预期。如果使用using std::swap; swap(xxx, xxx);的惯用法,不需要修改任何swap相关代码就能自动适配新的成员类型,避免漏改出错。 - 统一编码规范:所有swap实现都用统一写法,不需要开发者额外判断成员类型,降低心智负担,也避免不同开发者写出来的swap实现风格不统一,减少后续维护的理解成本。
有没有必须用惯用法的强制要求?
如果你100%确定这个结构体的成员永远不会变更,且所有成员都是没有自定义swap重载的内置/指针类型,那么直接调用std::swap没有任何问题,不存在语法或者规则层面的强制要求必须用using std::swap;的写法。
内容的提问来源于stack exchange,提问作者Fareanor
相关产品推荐
相关产品推荐

