【问题标题】:Is it possible to initialize a vector of vectors of non-copyable objects?是否可以初始化不可复制对象的向量向量?
【发布时间】:2014-11-30 19:55:02
【问题描述】:

是否可以初始化不可复制对象的向量向量?

class obj : private boost::noncopyable {
    // ...
};

vector<vector<obj> > v(10); // OK
for(int i = 0; i < v.size(); ++i)
    v[i].resize(10); // ERROR

还有

vector<vector<obj> > v(10, vector<obj>(10)); // ERROR

我了解为什么上面的代码无法编译。我要问的是是否有解决方法。看来如果std::vector 有一个像resize_from_zero 这样不需要复制构造函数的成员函数,那么这将是可行的。

(我的问题是关于 C++03,如果这有所作为)

【问题讨论】:

  • 是的,它有所不同——C++11 中有移动语义和emplace_back。
  • 是的,这在 C++11 中是可能的 - 如果类型不是默认可构造且不可移动,您的代码将无法工作。
  • 如果你使用原始类型而不是 obj。你的代码可以工作。但根据你的问题。你不能做你想做的事。你要么选择 c++11,要么做一些 puch_bcck s。
  • @BufBills 你是说 push_back 的?那些需要复制构造函数。
  • 需要明确的是,涵盖不可复制不可移动对象的 C++11 方法是否可以接受,或者您真的需要 C++03 方法吗? (我仍然认为它不适用于vector,但不同的容器类型可能会起作用。)

标签: c++ stdvector c++03 noncopyable


【解决方案1】:

这是不可能的; C++03 要求 vector 的元素是 CopyConstructible 和 Assignable 的。

参考:C++03 [lib.containers.requirements]/3

这些组件中存储的对象类型必须满足CopyConstructible的要求 types (20.1.3),以及Assignable types 的附加要求。

其中“这些组件”表示deque、list、queue、stack、vector、map、set、bitset。

(可能有也可能没有某种方式让它在特定的编译器上工作,但这超出了标准 C++ 的范围)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多