std::swap 不调用我的自定义交换实现 c++11

std::swap does not call my custom swap implementation c++11

我有这样的代码:

#include <utility>
#include <iostream>

struct thing {
    void swap(thing & other){
        std::cout << "swap method" << std::endl;
    }
};

void swap(thing & a, thing & b) {
    std::cout << "swap function" << std::endl;

    a.swap(b);
}

struct another{
    thing a;
};


int main(int argc, char** argv){
    another a, b;

    std::swap(a, b);
}

如果执行,它不会打印任何内容 - 例如它不使用我的 "custom" swap.

我读过我不应该 std::swap 专业化。

我是否需要为 class another 进行自定义交换,或者我遗漏了什么?

std::swap 不会调用您的 swap 实现。你应该做的(在通用代码中)是让重载决议选择你自己的:

namespace stuff
{
  struct foo { void swap(foo& other); };

  swap(foo& lhs, foo& rhs) { lhs.swap(rhs); }
}

int main()
{
  foo a, b;
  int i = 0;
  int j = 42;

  using std::swap;

  swap(i, j); // calls std::swap
  swap(a, b); // calls stuff::swap(stuff::foo&, stuff::foo&) via ADL
}

您明确调用 std::swap - 没有理由调用您的自定义方法。

但是,如果您更改它 - 请务必更改方法的接口 - 在这种形式下会出现编译错误。

您的 swap 期望 thing 的。这是你想要的吗?

int main(int argc, char** argv){
    another a, b;

    using std::swap; // let the compiler decide which swap to use

    swap(a.a, b.a); // calls swap(thing & a, thing & b) and thing.swap
}