Можно ли инициализировать вектор векторов не копируемых объектов?

0

Возможно ли инициализировать вектор векторов объектов, не подлежащих копированию?

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, если это имеет значение)

  • 2
    Да, это имеет значение - в C ++ 11 есть семантика перемещения и emplace_back .
  • 0
    Да, это возможно в C ++ 11 - ваш код не сможет работать, только если тип не является конструируемым по умолчанию и не может быть перемещен.
Показать ещё 3 комментария
Теги:
stdvector
c++03
noncopyable

1 ответ

1
Лучший ответ

Это невозможно; 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++).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню