忽略交换功能的重载

时间:2017-11-04 17:25:48

标签: c++ stl

我在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的可执行示例。

1 个答案:

答案 0 :(得分:2)

标准没有在其规范(§25.4.1.1[alg.sort])中说明std::sort实际上保证调用swap,它只提到该类型必须满足某些概念我不会将其解释为保证:

  

要求:   RandomAccessIterator的   应满足要求   ValueSwappable   (17.6.3.2)。该   类型   *第一   应满足要求   MoveConstructible   (表20)和   MoveAssignable   (表22)。

因此,只需可以调用它,具体取决于实现。 This answer也可能会提供相关信息。