c++ - 复制赋值运算符应该作为一般规则利用 std::swap 吗?

标签 c++ c++11

总是使用 std::swap 来实现我的复制赋值运算符是一个很好的通用做法吗?我的理解是,这提供了一种共享复制构造函数实现的方法。我想避免复制实际的复制逻辑本身。所以这就是我要做的:

class Foo
{
public:
    Foo(Foo const& other) { /* assume valid implementation */ }

    Foo& operator= (Foo other)
    {
        std::swap(*this, other);
        return *this;
    }
};

将“other”传递给赋值运算符的行为执行复制构造(此时我们已经共享了复制逻辑)。我假设交换将调用移动构造(这里有一个编译器生成的实现)。

我几乎对每个实现复制构造的类都这样做,因为赋值和构造函数从来没有不同的实现。

最佳答案

您的代码没有移动构造函数。您的复制构造函数会阻止自动创建移动构造函数,并试图移动您的类而不是复制它。

对于 move-assign,您的 operator= 也会阻止其自动执行,并且可以在其位置使用。

最终结果是an infinite recursive call of = (live code) .

如果遵循 0 规则,则不需要复制构造函数、移动构造函数、移动赋值、复制赋值或析构函数。如果你写了其中任何一个,你应该准备好写所有的。

使用 std::swap 可能很有用,但是因为你必须编写你的移动赋值和移动构造,所以根据 std::swap 来做是等待发生的无限递归。

关于c++ - 复制赋值运算符应该作为一般规则利用 std::swap 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25942131/

相关文章:

c++ - Qt 槽不在多线程 DLL 中执行

c++ - 用于迭代 "between each consecutive pair of elements"的成语

c++ - 关于成员函数指针值的 Constexpr - 未定义的行为?

c++ - 为什么 shared_ptr 使用placement new

c++ - Rcpp,使 R 从 DLL 中可以使用函数

c# - 如何在 C# 中存储从 C++ 函数返回的 uint8_t* 变量?

c++ - "std::string"或 "const std::string&"参数? (参数在内部被复制和修改)

c++ - 作用域枚举的 "using namespace X"等效项?

c++ - 如何创建自定义 C++ 类以与蓝图一起使用

C++ VS2008 - 类模板实例化的奇怪错误