这段代码工作正常:
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)
到底是怎么回事?
到底是怎么回事?
您无法创建第二个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)
到底是怎么回事?
您已从裸指针切换到强制执行所有权语义的指针。一个聪明的。
这就是unique_ptr.
它强制执行唯一的所有权。
你不能复制它;只有移动它。
如果您真的需要Test可复制并能够共享ints,那么您可能正在寻找shared_ptr.