Контейнер unique_ptr
, по-видимому, имеет мало смысла: вы не можете использовать его с списками инициализаторов, и мне не удалось выполнить итерацию через контейнер (обходные пути ниже). Я что-то не понимаю? Или когда имеет смысл использовать unique_ptr
и STL-контейнеры?Когда имеет смысл использовать unique_ptr с контейнерами STL? (C++ 11)
#include <memory>
#include <vector>
using namespace std;
struct Base { void go() { } virtual ~Base() { } };
// virtual ~Base() = default; gives
// "declared virtual cannot be defaulted in the class body" why?
class Derived : public Base { };
int main() {
//vector<unique_ptr<Base>> v1 = { new Derived, new Derived, new Derived };
//vector<shared_ptr<Base>> v2 = { new Derived, new Derived, new Derived };
vector<Base*> v3 = { new Derived, new Derived, new Derived };
vector<shared_ptr<Base>> v4(v3.begin(), v3.end());
vector<unique_ptr<Base>> v5(v3.begin(), v3.end());
for (auto i : v5) { // works with v4
i->go();
}
return 0;
}
Следующие вопросы помогли мне найти эти обходные пути
How to initialize a container of noncopyable with initializer list?
when I need containers of NoCopy types I usually use
boost::ptr_vector
orstd::vector<shared_ptr>
'вектор> v1 = {make_unique (), make_unique (), make_unique ()};' <- Вы проверить это? –
Как указывает @Benjamin, списки инициализаторов делают копии по определению, поэтому их нельзя использовать с объектами только для перемещения. – ildjarn
@Benjamin: По общему признанию, нет, поскольку в настоящее время у меня нет компилятора, который поддерживает списки инициализаций, подобные этому.Я не понимаю, какая проблема может возникнуть? – Xeo