【问题标题】:How to create a vector with non-copyable and non-assignable objects?如何创建具有不可复制和不可分配对象的向量?
【发布时间】:2018-03-22 06:38:01
【问题描述】:

我有课

class A {
 public:
  A(int x): x_(x) {}
  void SetValue(int m) {x_=m};
 private:
   DISALLOW_COPY_AND_ASSIGN(A);
};

我正在尝试创建 A 类型对象的向量

vector<std::unique_ptr<A>> objects;
objects.reserve(10);
for (int i = 0; i < 10; i++) {
   auto a = MakeUnique<A>();
   a->SetValue(20);
   objects.emplace_back(a);
}

这会导致调用 'std::unique_ptr&lt;A, std::default_delete&lt;A&gt; &gt;' 的已删除构造函数的编译错误

【问题讨论】:

  • DISALLOW_COPY_AND_ASSIGN(A) 不应是定义复制 ctor 和分配运算符的宏,它应该是一个基类,将复制和分配运算符标记为已删除,并默认移动操作。
  • @GuillaumeRacicot,虽然我总是从 boost noncopyable 驱动,但我看不到你的断言/公理在宏之上的优势

标签: c++ c++11 unique-ptr noncopyable


【解决方案1】:

std::unique_ptr 不可复制,需要将其移入容器中:

for (int i = 0; i < 10; i++) {
   auto a = MakeUnique<A>();
   a->SetValue(20);
   objects.emplace_back(std::move(a));
}

【讨论】:

  • C++17 的可能替代方案:auto &amp; a = objects.emplace_back(MakeUnique&lt;A&gt;()); a-&gt;SetValue(20);
  • objects.emplace_back(MakeUnique&lt;A&gt;()); objects.back()-&gt;SetValue(20);
  • @Xirema 虽然在这种情况下是等效的,但通常情况下,SetValue 可以抛出异常的情况会有所不同。我通常更喜欢在将对象交给容器之前完全设置它们。
  • @RustyX 查看我之前的评论:在这种情况下等效,在可能出现异常时不同。
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多