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

C++调用queue::emplace传入基本类型后原变量值是否保持不变

问题

由于C++中基本类型的析构函数不会执行任何操作,那么在调用queue::emplace之后,依赖int a的值保持不变是否安全?具体示例如下:

queue<int> q;
int a = 5;
q.emplace(a);
// 此处a的值是否仍为5?

上述问题的结论同样适用于以下示例的疑问:

queue<pair<int,int>> q;
int a = 1, b = 2;
q.emplace(a,b);
// 此处a是否等于1,b是否等于2?
解答

结论:两个示例中的原有变量值都不会被修改,依赖它们的值保持不变是完全安全的。

  • emplace的核心逻辑是在容器自身管理的内存空间内原地构造新元素,构造过程只会将传入的参数作为实参,拷贝/转发给新元素的构造函数,全程只会读取传入参数的值,不会对参数本身做任何修改。
  • 对于存储int的队列,q.emplace(a)本质是读取a存储的5这个值,拷贝初始化队列中新增的int元素,整个过程没有对a的写入操作,a的值自然保持为5。
  • 对于存储pair<int,int>的队列,q.emplace(a,b)是读取a、b的值作为pair构造函数的参数,在队列内存中直接构造新的pair对象,同样不会改动a、b本身的值,执行完后a依然是1,b依然是2。
  • 基本类型析构函数为空的特性和这个场景完全无关:析构函数只有在对象生命周期结束时才会被调用,emplace操作全程不会触碰你定义的局部变量a、b的生命周期,既不会调用它们的析构函数,也不会修改它们存储的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:18:21