Я понимаю, что следующий код не компилируется, так как конструктор перемещения A удаляется, потому что мьютекс не является подвижным.
class A {
public:
A(int i) {}
private:
std::mutex m;
};int main() {
std::vector<A> v;
v.emplace_back(2);
}
Но если я хочу мой A
храниться в стандартном контейнере, как мне поступить об этом? Я в порядке с A
строится «внутри» контейнера.
std::vector::emplace_back
возможно, потребуется увеличить емкость вектора. Поскольку все элементы вектора являются смежными, это означает перемещение всех существующих элементов в новое выделенное хранилище. Итак, код, реализующий emplace_back
в общем случае нужно вызывать конструктор перемещения (хотя для вашего случая с пустым вектором он будет вызывать ноль раз).
Вы не получили бы эту ошибку, если бы вы использовали, скажем, std::list<A>
,
Других решений пока нет …