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
中使用,对象必须是可复制或可移动的。