C++ 在已创建对象时设置 emplace 与 insert

C++ Set emplace vs insert when an object is already created

class TestClass {
    public:
     TestClass(string s) {

     }
   };

有了TestClass,我明白了emplace和insert的区别(emplace在place构造while insert副本)

   set<TestClass> test_set;
   test_set.insert(TestClass("d"));
   test_set.emplace("d");

但是,如果已经有一个 TestClass 对象,它们在机制和性能方面有何不同?

   set<TestClass> test_set;
   TestClass tc("e");
   test_set.insert(tc);
   test_set.emplace(tc);

Careful use of emplace allows the new element to be constructed while avoiding unnecessary copy or move operations. The constructor of the new element is called with exactly the same arguments as supplied to emplace, forwarded via std::forward(args)....

参考文献 here 让我相信这种非 "careful use" 会导致与插入非常相似的机制和性能,其具体细节可能是特定于编译器的。

emplace 通过将其参数完美转发到正确的构造函数来完成工作(在大多数实现中可能使用新的放置)。
因此,在您的情况下,它转发一个左值引用,因此它可能调用复制构造函数。
现在与显式调用复制构造函数的 push_back 有什么区别?

Meyers 在他的一本书中也引用了这一点,他说如果您已经拥有该对象的实例,那么调用 emplace 并没有实际的好处。