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

C++代码调用拷贝构造而非移动构造的异常现象原因咨询

C++ 构造函数调用逻辑解答

前两个案例理解核对

你的两个案例的理解完全正确:

  • 案例1中std::make_pair首先生成一个临时std::pair对象,该对象内部的NAME成员通过移动构造从临时NAME()得到;接着该临时pair作为右值传入foo的形参,触发pair的移动构造,内部NAME成员再次移动,因此总共输出1次default、2次move。
  • 案例2中使用花括号列表直接初始化foo的形参,属于复制列表初始化,直接在形参的内存地址上构造std::pair对象,省略了make_pair生成临时对象再移动的步骤,因此仅触发1次NAME的移动构造,总共输出1次default、1次move。

案例3执行逻辑解释

触发const版本拷贝构造的核心原因是:std::initializer_list的元素默认带const限定,无法被移动。
详细执行步骤如下:

  1. 首先调用NAME默认构造函数生成临时对象,输出default。
  2. 用临时NAME对象和字符串"an"构造std::pair<std::string, NAME>对象,该对象被存入花括号对应的std::initializer_list结构中,此步骤触发NAME的移动构造,输出move。
  3. std::vector从std::initializer_list构造时,由于initializer_list的迭代器指向const类型元素,无法对元素做移动操作(移动需要修改原对象,违反const限定),因此只能拷贝initializer_list中的pair元素,内部的NAME成员触发const版本的拷贝构造,输出const copy。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:45:04