带有不可复制项的C++ 0x emplace_back

tow*_*owi 9 stl c++11

我想知道我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
}
Run Code Online (Sandbox Code Playgroud)

因此,我真的很想知道如果我理解emplace_back不正确:我虽然会阻止复制Hero,因为它会就地创建项目.

或者它是我的g ++ - 4.7.0中的实现错误?

Soa*_*Box 6

您需要定义移动构造函数和移动赋值运算符,如下所示:

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;
};
Run Code Online (Sandbox Code Playgroud)

这允许将Hero类型的值移动到函数中.移动通常比复制快.如果类型既不可复制也不可移动,那么你不能在a中使用它std::vector.

  • @lurscher要在`std :: vector`中使用,对象必须是可复制的或可移动的. (2认同)