You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向std::map插入元素时,为何拷贝构造函数会被调用两次?

解答

咱们一步步拆解两次拷贝构造的触发场景:

  • 第一次拷贝:构造std::pair时的拷贝
    代码里的m.insert({"hello", C(42, 'c')});会先隐式构造一个std::pair<const std::string, C>对象。这里你手动创建的临时C对象(对应输出里的ctor),会被拷贝到这个pair的第二个成员位置,这就触发了第一次拷贝构造。

  • 第二次拷贝:插入map内部节点时的拷贝
    std::map底层是红黑树实现,插入元素时需要把构造好的pair对象拷贝到红黑树的节点中存储,这就引发了第二次拷贝构造函数的调用。

额外提示:优化消除拷贝

如果开启编译器优化(比如添加-O2编译参数),编译器会通过拷贝消除和返回值优化把这两次拷贝都省略掉,最终只会看到一次ctor输出。你可以试试用g++ -g -O2 ./main.cpp编译运行,就能验证这个效果。

内容的提问来源于stack exchange,提问作者StoneThrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:46:07