我想将一个对象放置到一个 std::map
中,它的构造函数不接受任何参数。但是,std::map::emplace
似乎除了键之外至少需要一个额外的参数。那么如何将零参数转发给构造函数呢?
最佳答案
std::map<K, V>
的元素类型实际上是std::pair<K, V>
,所以当你进入 map 时,参数将被转发给 std::pair
的构造函数.这就是为什么你不能只传递 key :std::pair<K, V>
不能由单个参数构造(除非它是另一对相同类型的参数。)您可以传递零个参数,但是键将被值初始化,这可能不是您想要的。
在大多数情况下,移动值会很便宜(并且键会很小且可复制),您真的应该这样做:
M.emplace(k, V{});
在哪里 V
是映射类型。它将被值初始化并移动到容器中。 (这个 Action 甚至可能被忽略;我不确定。)
如果你不能动,你真的需要V
要就地构造,必须使用分段构造构造函数...
M.emplace(std::piecewise_construct, std::make_tuple(k), std::make_tuple());
这会导致 std::pair
使用 k
构造第一个元素第二个元素使用零参数(值初始化)。
关于c++ - 如何将具有无参数构造函数的对象放置到 std::map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27553776/