将对象从指针移动到地图中而不调用复制构造函数

时间:2014-01-21 21:49:45

标签: c++11 move-semantics stdmap

GameObject个对象是不可复制的。我想将gameObject指向的对象移动到std::map<int,GameObject> gameObjects_而不调用其复制构造函数。此编译器错误地使用此代码,表明我正在尝试复制该对象。我做错了什么?

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

2 个答案:

答案 0 :(得分:2)

您展示的代码符合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()
{
}

使用tip-of-trunk clang + libc ++进行编译。对不起,我没有VC10解决方法。

更新

  

添加GameObject(GameObject&amp;&amp;)}修复了问题

啊!如果要移动对象,则必须确保它们具有移动构造函数(并且通常也移动赋值运算符)。

这是关于移动语义的非常简短的教程:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html

它有点陈旧,但它仍然正确地突出了基础知识而没有大量的阅读。

在C ++ 11中,有时会自动为您生成移动构造函数和移动赋值运算符。但是VC10没有实现编译器提供的移动成员,因此您现在不必担心这个方面。

在您的情况下(从NonCopyable派生),无论如何都不能隐式生成移动成员。所以你必须提供自己的。上面简要教程的链接描述了如何做到这一点,以及实际发生了什么。特别是,研究clone_ptr示例。

答案 1 :(得分:0)

为什么不std::unqiue_ptr

typedef std::unique_ptr<GameObject> GameObjectPtr;
typedef std::unordered_map<std::size_t, GameObjectPtr> GameObjectsMap;

然后只引用gameobject_t