Возможно ли инициализировать вектор векторов объектов, не подлежащих копированию?
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
которая не нуждалась в конструкторе копирования, тогда это было бы выполнимо.
(Мой вопрос о С++ 03, если это имеет значение)
Это невозможно; C++ 03 требует, чтобы элементы vector
были CopyConstructible и Assignable.
Rreference: C++ 03 [lib.containers.requirements]/3
Тип объектов хранятся в этих компонентах должны соответствовать требованиям
CopyConstructible
типов (20.1.3), а также дополнительные требованияAssignable
типов.
где "эти компоненты" означают deque
, list
, queue
, stack
, vector
, map
, set
, bitset
.
(Может быть, возможно, не будет какой-либо способ заставить его работать на конкретном компиляторе, но это выходит за рамки стандарта C++).
emplace_back
.