下面是代码的极简问题:
struct B {
B () = default;
//~B () {}; // error: use of deleted function ‘B& B::operator=(const B&)’
std::unique_ptr<int> m_pB = nullptr;
};
int main ()
{
std::vector<B> vB;
vB.erase(vB.begin());
}
除非取消注释析构函数,否则以上代码可以正常编译。根据我的要求,我需要一个 ~B()
的正文明确定义。
如何使用 unique_ptr
定义析构函数的主体?同类共存?
注意:尝试定义 = default
复制和移动构造函数的版本无济于事。在我的真实代码中,unique_ptr<int>
是unique_ptr<forward_declared_class>
.无法在 SO 中找到此问题,但我确信它一定存在。请随意标记为欺骗。
最佳答案
似乎您的代码需要 B
可复制构造并可复制分配给 std::vector
(至少对于我测试过的 visual c++)。
复制构造函数和复制赋值运算符只能是 = delete
因为 std::unique_ptr
(声明的实现 = default
应该导致函数也被删除),并且通过实现析构函数,您可以禁用移动构造函数和移动赋值运算符的默认实现。
因此您需要显式声明移动赋值运算符。尝试:
#include <memory>
#include <vector>
struct B {
B () = default;
~B () {}
B& operator=(B&&) = default;
std::unique_ptr<int> m_pB = nullptr;
};
int main ()
{
std::vector<B> vB;
vB.erase(vB.begin());
}
关于c++ - 当在类主体中使用 unique_ptr 声明析构函数作为同一类的成员时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654699/