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

Qaz*_*Qaz 5 c++ memory-leaks set c++11 emplace

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

C++ 11、海湾合作委员会 4.7.0

Lig*_*ica 3

它根本不应该构造该对象,但它通常会无论如何(当然使用libstd++);从技术上讲,这是一个错误,但在标准中更是如此。

更完整的细节可以在我之前对一个非常相似的问题的回答中找到:

  • 如果它不构造一个对象,它如何测试该对象是否存在于集合中?我阅读了您对另一个问题的回答以及链接的 isocpp 讨论,但我看不出它有何关联。在讨论中,您似乎正在讨论构建映射的键/值对的值部分。这是关于构造一个密钥,我不知道如何避免它(但我非常有兴趣展示)。 (2认同)