std::移动 unique_ptr 的 boost::flat_map

问题描述 投票:0回答:1

我希望能够初始化一个在构造函数中包含

boost::container::flat_map<std::string, std::unique_ptr<AbstractBaseClass>>
的类。示例:

class MapHolder {
public:
   MapHolder(boost::container::flat_map<std::string, std::unique_ptr<AbstractBaseClass>> &&map):
   _map(std::move(map)) {}

private:
   boost::container::flat_map<std::string, std::unique_ptr<AbstractBaseClass>> _map;
};

MapHolder m({
   {"test", std::make_unique<ConcreteDerivedClass>("val")}
});

我不断收到错误,它正在尝试复制

unique_ptr
而不是移动它们。有什么办法可以解决这个问题吗?

c++ boost containers unique-ptr stdmove
1个回答
0
投票

看起来像boost中的一个错误,

initializer_list
构造函数只能在可复制对象上调用,而不是可移动对象......您可以不使用
initializer_list
构造函数并使用
emplace
代替,或者编写自己的工厂函数将采用初始化器列表并初始化
flat_map
,但它可能比
initializer_list
构造函数慢。

#include <iostream>
#include <boost/container/flat_map.hpp>
#include <memory>
#include <string>

struct Moveable {
    Moveable(Moveable&&) = default;
    Moveable& operator=(Moveable&&) = default;
};

struct Copyable {
    Copyable(const Copyable&) = default;
    Copyable& operator=(const Copyable&) = default;
};


int main(int argc, char** argv) {

    boost::container::flat_map<std::string, Copyable> map_copy{{"name", Copyable{}}};
    
    // next line errors
    // boost::container::flat_map<std::string, Moveable> map_move{{"name", Moveable{}}};

    boost::container::flat_map<std::string, Moveable> map_move2;
    map_move2.emplace("name", Moveable{});

}
© www.soinside.com 2019 - 2024. All rights reserved.