Передача std::vector в конструктор и семантика перемещения

В выходные, когда я пытался освежить свои навыки работы с С++ и немного изучить С++ 11, я наткнулся на следующую проблему: я не могу заставить свой контейнер class для правильного использования конструктора перемещения:

У меня есть класс Builder, который определен следующим образом:

class builder
{
   ...
   container build() const
   {
     std::vector<items> items;

     //... fill up the vector

     return container(items); //should move the vector right? wrong!
     //return container(std::move(items)); also doesn't work
   }
}

И классы item и container, определенные следующим образом:

class container
{
public:

    container(std:vector<item> items)
      : items_(items) // always invokes copy constructor on vector, never move
    { }

    container(container&& rhs)
    {
       ...
    }

    ...

private:
    std::vector<item> items_;

}

class item
{
public:
    //move .ctor
    item(item && rhs);
    item& operator=(item && rhs);

    //copy .ctor
    item(const item& rhs); //this gets called instead of move .ctor
    item& operator=(const item& rhs);

    ...
}

Теперь мой код просто использует

builder my_builder;
...
auto result = my_builder.build();

, что приводит к тому, что каждый элемент быть сначала созданным, а затем скопированным...

Как мне написать следующие классы, чтобы не копировать элементы? Должен ли я просто вернуться к использованию стандартных указателей?

11
задан ghord 1 April 2012 в 11:03
поделиться