我希望能够初始化一个在构造函数中包含
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
而不是移动它们。有什么办法可以解决这个问题吗?
看起来像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{});
}