我在this answer中为我的类重载了swap函数,但在排序(std::sort
)时,编译器仍在使用std::swap
。我认为我的方法与相关答案中所述的方法没有任何区别。这是我的代码的再现:
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
struct B
{
struct A
{
friend void swap(A & a, A & b)
{
std::swap(a.a, b.a);
std::cout << "my swap\n";
}
A(int _a) : a(_a) {}
bool operator<(const A & other) { return a < other.a; }
int a;
};
};
int main()
{
std::vector<B::A> v{1, 2, 3, 5, 4};
std::sort(std::begin(v), std::end(v));
}
此外,还提供了here的可执行示例。
答案 0 :(得分:2)
标准没有在其规范(§25.4.1.1[alg.sort])中说明std::sort
实际上保证调用swap
,它只提到该类型必须满足某些概念我不会将其解释为保证:
要求: RandomAccessIterator的 应满足要求 ValueSwappable (17.6.3.2)。该 类型 *第一 应满足要求 MoveConstructible (表20)和 MoveAssignable (表22)。
因此,只需可以调用它,具体取决于实现。 This answer也可能会提供相关信息。