交换函数的 C++ 重载不起作用

C++ overload of swap function not working

我正在编写自定义 class,我想为其使用 std::swap 函数。

正如我在这篇 post How to overload std::swap() 中读到的,我必须在我尝试交换的对象的同一命名空间中重载它,这里有一个例子。

I (thing) 我正在复制示例,但是使用 std::swap() 时调用的函数不是我定义的函数。

下面是我的代码:

//grid.hpp
namespace myname {
template <typename T>
class Grid
{
    ...
    friend void swap(Grid &a, Grid &b)
    {
        using std::swap;
        std::cout << "Custom Swap Used" << std::endl;
        swap(a.nrwow, b.nrows);
        swap(a.ncols, b.ncols);
        a.grid.swap(b.grid);
    }
}
}

但是当我调用交换函数时没有字符串被打印出来,所以这个函数没有被调用。

//file.cpp
#include"../src/grid.hpp"

int main() {
myname::Grid<int> grid1(10, 10);
myname::Grid<int> grid2(10, 10);
std::swap(grid1, grid2); // this should print a string
}

您必须使用 std::ranges::swap,或者如果您不使用 C++20,则可以通过 ADL 找到它:

myname::Grid<int> grid1(10, 10);
myname::Grid<int> grid2(10, 10);

std::ranges::swap(grid1, grid2);

// Or with ADL
using std::swap;
swap(grid1, grid2);

"Swapping"并不完全是std::swap的意思,而是using std::swap; swap(x, y);的这种形式,被std::ranges::swap.

封装了

std::swap(grid1, grid2)直接调用默认的template<typename T> void std::move(T&, T&);。这将使用移动构造和移动赋值运算符而不是您的自定义交换函数,这就是您看不到 "Custom Swap Used".

的原因