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
相关产品推荐
相关产品推荐

