1

我有这两个简单的代码:

void f(){
    std::map<int,std::unique_ptr<int>> map_;
    std::unique_ptr<int> p;
    map_[42] = std::move(p);
}

确实建立

struct test_s{
    int toto;
    std::unique_ptr<int> tata;
};
void f(){
    std::map<int,test_s> map_;
    test_s p;
    map_[42] = std::move(p);
}

无法构建,因为在可视 ctp120 上禁止复制 它确实在带有 Clang 4.2 的 MAC 上构建

任何人都知道我应该改变什么来完成这项工作?

4

1 回答 1

1

显式定义移动构造函数和移动赋值运算符是一种解决方法(使用 VS2010 测试):

struct test_s{
    int toto;
    std::unique_ptr<int> tata;
    test_s() : toto(0) {}
    test_s& operator=(test_s&& o)
    {
        toto = o.toto;
        tata = std::move(o.tata);
        return *this;
    }
    test_s(test_s&& o) : toto(o.toto), tata(std::move(o.tata)) {}
};

作为猜测,MSVC 不会自动生成移动操作。

于 2013-05-23T13:22:57.177 回答