c++ - 根据非成员 swap() 实现成员 swap()

标签 c++ c++17 swap overload-resolution argument-dependent-lookup

我正在实现一个与 std::array 具有类似接口(interface)的类,它同时具有 member swap()non-member swap() .

由于我希望我的类模仿标准容器,因此我想实现两种 swap() (非成员 swap() 是通过ADL,因为不允许专门化 std::swap()):

class A {
    public:
        friend void swap(A& a, A& b) { /* swap the stuff */ }
        void swap(A& other) { swap(*this, other); }
};

但是,似乎我无法从类内部调用非成员 swap() ,因为它更喜欢成员 swap() 即使它只有一个参数。将其更改为 ::swap(*this, other) 也不起作用,因为类内友元函数只能通过 ADL 找到。我如何从类内部调用非成员 swap()

最佳答案

问题是成员函数swap的名称隐藏了A::swap主体中的命名空间范围swap。在 A::swap 中对 swap 进行非限定名称查找将永远找不到命名空间范围 swap,因此,命名空间范围 swap 不会成为重载集的一部分。解决这个问题的一种方法是简单地在 A::swap 主体中添加命名空间范围 swap 的声明:

class A
{
public:
    friend void swap(A& a, A& b) { /* swap the stuff */ }

    void swap(A& other)
    {
        void swap(A& a, A& b);
        swap(*this, other);
    }
};

话虽这么说,我不确定这对你到底有什么作用。显而易见的解决方案是仅根据 A::swap 实现 namespace 范围 swap,而不是相反。就我个人而言,我一开始就没有 swap 成员函数。 The typical way of swapping ab只是交换(a, b)...

关于c++ - 根据非成员 swap() 实现成员 swap(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59564137/

相关文章:

c++ - Visual Studio 2017 的 CUDA 9 不支持错误

mysql - 在主键冲突的 MySQL 中交换两个不同行上的两列

c++ - 为什么 C++ 不使结构更紧密?

c++ - 设计类聚合 - 堆栈分配与动态内存分配

c++ - Shared_ptr 的删除器是否存储在自定义分配器分配的内存中?

c++ - 返回引用时的 std::vector::emplace_back 错误 (C++17)

c++ - 无法在赋值运算符中访问基类的 protected 方法

oracle - 如何使用Oracle交换 `=`之前和之后的值?

java - 如何使用 JConsole 分析交换空间

c++ - 在构造函数中实现一个函数