gpt4 book ai didi

STL - 具有不可复制项的C++ 0x emplace_back

转载 作者:行者123 更新时间:2023-12-04 03:34:09 27 4
gpt4 key购买 nike

我想知道我是否正确理解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的副本,但它会原位创建Item。

还是在我的g++-4.7.0中实现错误?

最佳答案

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

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中使用它。

关于STL - 具有不可复制项的C++ 0x emplace_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7050651/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com