Stl C++;0x使用不可复制的项重新放置\u
我想知道我是否理解正确Stl C++;0x使用不可复制的项重新放置\u,stl,c++11,Stl,C++11,我想知道我是否理解正确 #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&) = del
#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
}
#包括
使用名称空间std;
结构英雄{
英雄(常量字符串&){}
英雄(const char*){}
英雄(int){}
//禁止克隆:
英雄(const-Hero&)=删除;
Hero&运算符=(const Hero&)=删除;
};
int main(){
vector heros1={“邦德”、“绿巨人”、“泰山”};//错误:复制?
矢量英雄;
heros.emplace_back(5);//错误:复制
heros.emplace_back(string(“Bond”);//错误:复制
heros.emplace_back(“绿巨人”);//错误:复制
}
因此,我真的想知道我是否错误地理解了emplace\u back
:我认为这会阻止复制Hero
,因为它会在适当的位置创建项目
或者这是我的g++-4.7.0中的一个实现错误?嗯。。。我明白了
如果我允许复制英雄,我必须允许他们移动,如果我想把他们放在容器里。我真傻
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&&) {}
};
除初始值设定项列表外,所有示例均有效。这不是实现错误-您没有提供移动构造函数。您需要定义移动构造函数和移动赋值运算符,如下所示:
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
中使用它,因为您太快了!我只是在打我自己的答案;-)它不再是C++0x。现在只是C++了!代码>:)请注意,emplace\u back
本身并不要求字体可移动-它确实按照您的想法在适当的位置构建项目。然而,std::vector
通常要求其元素类型可以是可移动的或可复制的,否则它无法根据需要增长。还应该注意的是,如果缺少这些元素,它们将为您生成,这就是为什么编译的代码和ranthis是荒谬的。如果您需要一个移动构造函数,那么emplace并没有真正地将任何可变参数转发给内置构造函数,您仍然在制作一个移动副本。那会让emplace_完全回来useless@lurscher要在std::vector
中使用,对象必须是可复制或可移动的。