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

时间:2011-08-13 13:18:10

标签: 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
}

因此,我真的很想知道如果我错误地理解emplace_back:我会阻止制作Hero的副本,因为它会创建项目就地

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

3 个答案:

答案 0 :(得分: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;
};

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

答案 1 :(得分:4)

没有实现错误 - 您没有提供移动构造函数。

答案 2 :(得分:3)

呃......我明白了。

如果我想要复制 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&&) {}
};

所有示例除了初始化列表都有效。