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

C++ 如果我在整个类上使用std::swap,是否会使用专门的shared_ptr::swap()函数?,c++,class,shared-ptr,swap,C++,Class,Shared Ptr,Swap,std::swap()函数对一个包含各种各样的对象作为变量成员的类是否可以正常工作?特别是,如果其中一些成员是智能指针 class test { ... std::shared_ptr<other_test> m_other; ... }; test ta, tb; std::swap(ta, tb); 类测试 { ... std::共享的ptr m_其他; ... }; 测试ta、tb; 标准:交换(ta,tb); std::swap()可以编译,

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

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

test ta, tb;
std::swap(ta, tb);
类测试
{
...
std::共享的ptr m_其他;
...
};
测试ta、tb;
标准:交换(ta,tb);
std::swap()可以编译,但我对其功能有疑问。具体来说,我知道智能指针有一个专门的交换(即
m_other.swap(rhs.m_other)


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

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

如果您关心这一点,请为您的类实现
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选择最佳重载。

它将只使用移动赋值/移动构造函数。
std::ranges::swap()
是否能够恢复到最佳ADL版本?@AlexisWilke是的。它的存在正是为了解决这个问题。请参阅Eric Niebler的。@AlexisWilke,对不起,我搞砸了。
std::swap
已经修改到位,并且没有引入
std::ranges::swap