哪些移动分配,复制分配和交换操作(如果有的话)也可以在集合和映射的嵌入式比较器上运行?
(换句话说,如果我swap
两个set
,他们的比较器也会被交换,或者没有?)
如果旧版本的C ++(例如C ++ 98或C ++ 03)的答案不同,请提及。
答案 0 :(得分:1)
标准包含以下保证
对于关联容器,除非交换容器的Compare对象(如果有)抛出异常,否则交换函数不会抛出异常。
答案是肯定的 - 交换函数也会交换比较对象。
引用的是C ++ 11-17。我没有早期的草稿。
对于复制和移动 - 我只能推断 - 由于任何合理的复制/移动实现使用交换,相同的答案都是正确的。但我还没有找到具体的引用......
答案 1 :(得分:1)
引用n1905(我可以找到最接近官方2003年出版物,虽然它是后来的),根据一般的容器要求:
[lib.container.requirements] / 11:
除非另有说明,否则所有容器 本节中定义的类型符合以下附加条件 要求:
- 没有swap()函数抛出异常,除非该复制构造函数或赋值运算符抛出该异常 容器的比较对象
因此,如果一个Compare对象需要复制,这几乎指明它应该被复制。