当member是unique_ptr时删除了复制构造函数

Key*_*rys 2 c++

这段代码工作正常:

class Test
{
    int* ptr = new int(10);
};

int main()
{       
     Test o;
     Test t = o;
}
Run Code Online (Sandbox Code Playgroud)

但是当我们使用unique_ptr而不是raw ptr时,我们会收到一个错误:

error: use of deleted function 'Test::Test(const Test&)'
Run Code Online (Sandbox Code Playgroud)

示例代码:

class Test
{
     std::unique_ptr<int> ptr = std::make_unique<int>(1);
};

int main()
{       
     Test o;
     Test t = o;
}
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

use*_*999 6

到底是怎么回事?

您无法创建第二个Test实例,因为这意味着您需要unique_ptr的副本,这是不可能的.unique_ptr只能移动.尝试实现移动对齐操作符并o像这样移动:

class Test
{
public:
    Test() = default;

    Test(Test&& other) noexcept
        : ptr(std::move(other.ptr))
    {
    }

private:
    std::unique_ptr<int> ptr = std::make_unique<int>(1);
};

int main()
{
    Test o;
    Test t = std::move(o);
}
Run Code Online (Sandbox Code Playgroud)

如果要复制unique_ptr底层的int,则需要定义一个自定义复制构造函数,如下所示:

class Test
{
public:
    Test() = default;

    Test(const Test& other)
        : 
    ptr(new int(*other.ptr))
    {

    }

    Test(Test&& other) noexcept
        : ptr(std::move(other.ptr))
    {
    }

private:
    std::unique_ptr<int> ptr = std::make_unique<int>(1);
};

int main()
{
    Test o;
    Test t = o;
}
Run Code Online (Sandbox Code Playgroud)

但是,请注意,指针指向两个不同的 int.如果您想要共享所有权,您必须(并且应该)使用shared_ptr,如下所示:

class Test
{
private:
    std::shared_ptr<int> ptr = std::make_shared<int>(1);
};

int main()
{
    Test o;
    Test t = o;
}
Run Code Online (Sandbox Code Playgroud)


Lig*_*ica 5

到底是怎么回事?

您已从裸指针切换到强制执行所有权语义的指针。一个聪明的。

这就是unique_ptr.

它强制执行唯一的所有权

你不能复制它;只有移动它。

如果您真的需要Test可复制并能够共享ints,那么您可能正在寻找shared_ptr.

  • @KeyB0rys 见:https://timsong-cpp.github.io/cppwp/class.copy.ctor#10 (2认同)