Вставка объекта, имеющего не копируемое поле, в std :: vector

Я понимаю, что следующий код не компилируется, так как конструктор перемещения A удаляется, потому что мьютекс не является подвижным.

class A {
public:
A(int i) {}

private:
std::mutex m;

};int main() {
std::vector<A> v;
v.emplace_back(2);
}

Но если я хочу мой A храниться в стандартном контейнере, как мне поступить об этом? Я в порядке с A строится «внутри» контейнера.

1

Решение

std::vector::emplace_back возможно, потребуется увеличить емкость вектора. Поскольку все элементы вектора являются смежными, это означает перемещение всех существующих элементов в новое выделенное хранилище. Итак, код, реализующий emplace_back в общем случае нужно вызывать конструктор перемещения (хотя для вашего случая с пустым вектором он будет вызывать ноль раз).

Вы не получили бы эту ошибку, если бы вы использовали, скажем, std::list<A>,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]