set :: emplace如何处理已经在集合中的对象?

时间:2014-03-27 01:20:05

标签: c++ c++11 memory-leaks set emplace

我有一组对象,我想使用emplace将对象添加到集合中。如果集合中不存在等效对象,则set :: \ templates会创建一个对象并将其放入集合中。如果集合已经具有等效对象,则set :: \ templates不会将对象添加到列表中。在这种情况下,它是创建对象并将其销毁,创建并泄漏它,还是根本不创建它?或者它会做其他事情吗?

C ++ 11,gcc 4.7.0

2 个答案:

答案 0 :(得分:3)

来自§23.2.4表102 - 关联容器要求(除容器外)

emplace(args)

  

效果:当且仅当容器中没有与value_type键相同的键的元素时,插入t对象std::forward<Args>(args)...构造t。 / p>

答案 1 :(得分:2)

它根本不应该构造对象,但它通常会(无论如何使用 libstd ++ );这在技术上是一个错误,但在标准中比其他任何东西都更多。

富勒的细节可以在我之前的答案中找到一个非常相似的问题: