C++11 将对象从指针移动到映射中而不调用复制构造函数

C++11 将对象从指针移动到映射中而不调用复制构造函数,c++11,move-semantics,stdmap,C++11,Move Semantics,Stdmap,GameObject对象是不可压缩的。我想将gameObject指向的对象移动到std::map gameObjects\uu中,而不调用其复制构造函数。此编译器使用此代码出错,表明我正在尝试复制该对象。我做错了什么 void GameObjectManager::addObject(int id,GameObject* gameObject){ gameObjects_.insert(std::make_pair(id,std::move(*gameObject))); } 为什么不

GameObject
对象是不可压缩的。我想将
gameObject
指向的对象移动到
std::map gameObjects\uu
中,而不调用其复制构造函数。此编译器使用此代码出错,表明我正在尝试复制该对象。我做错了什么

void GameObjectManager::addObject(int id,GameObject* gameObject){
    gameObjects_.insert(std::make_pair(id,std::move(*gameObject)));
}
为什么不呢

typedef std::unique_ptr GameObjectPtr;
typedef std::无序地图GameObjectsMap;

然后只需参考
gameobject\t

您显示的代码符合C++11。这是一个完整的演示:

#include <map>

struct GameObject
{
    GameObject(GameObject&&) = default;
};

class GameObjectManager
{
    std::map<int, GameObject> gameObjects_;
public:

    void
    addObject(int id,GameObject* gameObject)
    {
        gameObjects_.insert(std::make_pair(id,std::move(*gameObject)));
    }
};

int
main()
{
}
#包括
结构游戏对象
{
游戏对象(游戏对象&&)=默认值;
};
类GameObjectManager
{
地图游戏对象;
公众:
无效的
addObject(int-id,GameObject*GameObject)
{
gameObjects_uu.insert(std::make_pair(id,std::move(*gameObject));
}
};
int
main()
{
}
它使用树干的尖端叮当+libc++编译。抱歉,我没有VC10解决方案

更新

添加GameObject(GameObject&&{}修复了这个问题

啊!!如果要移动对象,必须确保它们具有移动构造函数(通常还有移动赋值操作符)

下面是一个关于移动语义的非常简短的教程:

这本书有点过时,但它仍然正确地突出了基本内容,而无需大量阅读

在C++11中,有时会自动生成移动构造函数和移动赋值运算符。然而,VC10并没有实现编译器提供的移动成员,所以您现在不必担心这方面的问题


在您的情况下(源自
不可复制
),移动成员无论如何都不能隐式生成。所以你必须自己供应。上面简短教程的链接描述了如何做到这一点,以及实际发生的情况。特别是,研究一下
clone\u ptr
示例。

我不想这样做,因为在遍历指针时,指针映射会导致额外的缓存丢失。当然,这不会对我将要编写的任何代码产生任何实际影响,但我想看看如果我正在编写性能关键型代码,我将如何做到这一点。事实上,您的方法。您的编译器中一定有缺陷。。也许是因为他们让你的游戏对象类型不可复制?弗朗索瓦·莫伊桑是正确的-在类中添加
GameObject(GameObject&&){}
意味着它可以很好地编译。以前它只是从sf::NonCopyable继承的。对此的解释将不胜感激。添加
GameObject(GameObject&&&){}
修复了此问题-请给出解释。我现在使用的是Visual Studio 2013,但添加
GameObject(GameObject&&)=默认值
导致错误c2610:“不是可以默认的特殊成员函数”。@pighead10:抱歉,对于默认移动成员,您可能需要等待VS2014。同时,您可以按照教程链接中的描述手动实现移动构造函数。
#include <map>

struct GameObject
{
    GameObject(GameObject&&) = default;
};

class GameObjectManager
{
    std::map<int, GameObject> gameObjects_;
public:

    void
    addObject(int id,GameObject* gameObject)
    {
        gameObjects_.insert(std::make_pair(id,std::move(*gameObject)));
    }
};

int
main()
{
}