c++ - 当在类主体中使用 unique_ptr 声明析构函数作为同一类的成员时出现编译器错误

标签 c++ c++11 compiler-errors destructor unique-ptr

下面是代码的极简问题:

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/

相关文章:

angular - 类型 'switchMap' 上不存在属性 'Observable<User>'

使用无效类的 Java 通用类型 get 调用不会导致编译器错误

c++ - 如何重载模板函数以用于枚举?

c++ - Rcpp、C++11、 vector 和 Windows 的问题

c++ - 有条件地替换字符串中的正则表达式匹配

c++ - 如何创建一个 unordered_set 的 shared_ptr 对象?

c++ - 为什么 `std::pair<int, movable>` 需要 [deleted] `const&` 复制构造函数?

compiler-errors - 为什么在方法签名中使用 hyper::Client 时会出现错误 "wrong number of type arguments"?

c++ - FFmpeg:做一个应用程序比直接使用ffmepg更好吗

c++ - 信号/槽与直接函数调用