gpt4 book ai didi

c++ - 使用 unique_ptr 时引用已删除的函数

转载 作者:行者123 更新时间:2023-11-27 22:46:29 24 4
gpt4 key购买 nike

我有以下类定义:

class InterpolatedSpreadConnector
{
public:
~InterpolatedSpreadConnector() = default;
GPUImage* operator()() override;

GPUImage* AncestorReducedConnectivity = nullptr;
GPUImage* OffspringReducedConnectivity = nullptr;
};

,当在声明中使用时 auto connector = InterpolatedSpreadConnector();工作得很好。我想将这些原始指针更改为 unique_ptr s,然而。

包括memory并将原始指针替换为 std::unique_ptr<GPUImage>定义中的成员给了我一个 attempting to reference deleted function InterpolatedSpreadConnector 上的错误复制构造函数。奇怪的是,如果我更换 unique_ptr,错误就会消失用shared_ptr .

谁能解释为什么会这样?

最佳答案

要使此代码正常工作,在 C++17 之前,您需要为您的类定义一个移动构造函数。这可以很简单:

 InterpolatedSpreadConnector(InterpolatedSpreadConnector &&) = default;

您的用户定义的析构函数意味着移动构造函数的隐式生成被抑制了。

在没有移动构造函数的情况下,复制/移动操作回退到复制构造函数,这会导致编译错误,因为隐式生成的复制构造函数被删除,因为 unique_ptr 已删除复制构造函数。


在 C++14 及更早版本中,auto x = X(); 在概念上意味着我们创建一个临时的 X 然后复制/移动构造 x 从临时文件中取出并销毁临时文件。允许编译器 elide该过程的临时但正确的构造函数必须仍然存在。

但是在 C++17 中,auto x = X(); 将被定义为与 X x{}; 相同。

所以你的代码将在 C++17 中工作,尽管无论如何定义移动构造函数是个好主意;或者最好删除析构函数定义(参见 Rule of zero )。

关于c++ - 使用 unique_ptr 时引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com