C ++ 0x emplace_back с не копируемыми элементами - PullRequest
9 голосов
/ 13 августа 2011

Интересно, правильно ли я понял emplace_back

#include <vector>
using namespace std;

struct Hero {
    Hero(const string&) {}
    Hero(const char*) {}
    Hero(int) {}
    // forbid a clone:
    Hero(const Hero&) = delete;
    Hero& operator=(const Hero&) = delete;
};

int main() {
    vector<Hero> heros1 = { "Bond", "Hulk", "Tarzan" }; // ERR: copies?

    vector<Hero> heros;
    heros.emplace_back( 5 );              // ERR: copies
    heros.emplace_back( string("Bond") ); // ERR: copies
    heros.emplace_back( "Hulk" );         // ERR: copies
}

Таким образом, мне действительно интересно, если я неправильно понял emplace_back: я думал, что не позволит сделать копиюHero, потому что он создает элемент на месте .

Или это ошибка реализации в моем g ++ - 4.7.0?

Ответы [ 3 ]

6 голосов
/ 13 августа 2011

Вам нужно определить конструктор перемещения и оператор присваивания, например:

struct Hero {
    Hero(const string&) {}
    Hero(const char*) {}
    Hero(int) {}

    Hero(Hero&&) {}
    Hero& operator=(Hero&&) { return *this; }

    // forbid a clone:
    Hero(const Hero&) = delete;
    Hero& operator=(const Hero&) = delete;
};

Это позволяет перемещать значения типа Hero в функцию. Перемещение обычно быстрее, чем копирование. Если тип не является ни копируемым, ни подвижным, вы не можете использовать его в std::vector.

4 голосов
/ 13 августа 2011

Это не ошибка реализации - вы не предоставили конструктор перемещения.

3 голосов
/ 13 августа 2011

Э-э ... Я понял.

Если я перевожу на копию Hero с, я должен разрешить им переместить , если я хочуположить их в контейнеры.Как глупо с моей стороны.

struct Hero {
    Hero(const string&) {}
    Hero(const char*) {}
    Hero(int) {}
    // no clone:
    Hero(const Hero&) = delete;
    Hero& operator=(const Hero&) = delete;
    // move only:
    Hero(Hero&&) {}
    Hero& operator=(Hero&&) {}
};

И все примеры , за исключением списка инициализатора , работают.

...