如果我在整个班级上使用std ::交换,则会使用专门的shared_ptr :: swap()函数

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

本文关键字:shared 函数 swap ptr 交换 如果 std      更新时间:2023-10-16

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

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是有所不同的。

不,可能不会。如果您不为自己的班级过载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以来,不再是这种情况&mdash;std::swap(a, b)自动使用ADL选择最佳的过载。