如果我在整个 class 上使用 std::swap,是否会使用专门的 shared_ptr::swap() 函数?

Will the specialized shared_ptr::swap() function be used if I use std::swap on a whole class?

std::swap() 函数是否可以针对具有各种对象作为变量成员的 class 正常工作?特别是,如果其中一些成员是智能指针?

class test
{
    ...
    std::shared_ptr<other_test>   m_other;
    ...
};

test ta, tb;
std::swap(ta, tb);

std::swap() 可以编译,但我对功能有疑问。具体来说,我知道智能指针有专门的交换(即 m_other.swap(rhs.m_other).

我使用的是 C++14,这很重要。

不,可能不会。如果您不为您自己的 class 重载 swap,它将在其实现中使用您的 class 的移动操作。这些移动操作不会使用 swap 除非你自己实现它们。

如果您关心这个,请为您的 class 实施 swap

class test {
    // ...
    friend void swap(test& lhs, test& rhs)
    {
        using std::swap;
        // replace a, b, c with your members
        swap(lhs.a, rhs.a);
        swap(lhs.b, rhs.b);
        swap(lhs.c, rhs.c);
    }
    // ...
};

请注意,在 C++20 之前,调用 swap 的正确方法是通过 ADL:

using std::swap;
swap(a, b);

而不仅仅是 std::swap(a, b).

自 C++20 起,情况不再如此 — std::swap(a, b) 自动使用 ADL 来 select 最佳重载。