1

私はこれらの2つの簡単なコードを持っています:

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);
}

Visual 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 に答える