首页 > 解决方案 > 如何就地创建+填充容器?

问题描述

我正在尝试创建一个无法复制或移动的类数组。所以我需要就地创建对象,但我不知道该怎么做:

#include <vector>

struct Foo {
  Foo(int) { }
  Foo(const Foo &) = delete;
  Foo & operator =(const Foo &) = delete;
  Foo(Foo &&) = delete;
  Foo & operator =(Foo &&) = delete;
};

struct Bla {
  Bla(const std::vector<int> & args) {
    for (auto i : args) {
      foo.emplace_back(i);
    }
  }
  std::vector<Foo> foo;
};

编译器抱怨删除的移动构造函数,因为它不能保证所有对象都是就地构造并且从不移动。我不必std::vector用作容器,所以请随意提出其他建议。

标签: c++in-place

解决方案


您可以使用std::vectors 迭代器对构造函数来构造对象,例如

Bla(const std::vector<int> & args) 
    : foo(args.begin(), args.end())
{}

如果您需要在构造中包含其他参数,则可以切换到任何基于节点的容器,例如std::list

struct Bla {
  Bla(const std::vector<int> & args) {
    for (auto i : args) {
      foo.emplace_back(i, some_other_argument);
    }
  }
  std::list<Foo> foo;
};

推荐阅读