У меня есть эта строка здесь:
someSTLVector.push_back(SomeClass(...));
Я надеялся, что SomeClass
будет построен и перемещен в конец вектора, без каких-либо копий. Однако деструктора вызвали сюда. Я попытался изменить это с помощью std::move
:
someSTLVector.push_back(std::move(SomeClass(...)));
, но результат не изменился.
Я также попытался определить следующее в SomeClass
:
SomeClass(SomeClass&&) = default;
SomeClass& operator= (SomeClass&&) = default;
SomeClass(const SomeClass&) = delete;
SomeClass& operator= (const SomeClass&) = delete;
Это тоже не помогло, деструктора все еще звали. Обратите внимание, что SomeClass
содержит ссылку в качестве члена
Очевидно, что SomeClass
создается, а затем копируется в вектор. Я не хочу этого избегать, и он должен быть построен как часть вектора (или, по крайней мере, перемещен в вектор, избегая любого копирования). SomeClass
управляет ресурсами, которые высвобождаются в деструкторе. Если при копировании объекта вызывается деструктор, ресурс освобождается и объект становится недействительным, указывая на ресурс, который больше не существует.
Как создать экземпляр класса, в котором полученный объект будет помещен в задняя часть вектора, но не копируется (и, следовательно, уничтожается) в процессе?