C++17中std::pair内vector重分配是否会导致引用失效?
问题
定义如下std::pair对象:
std::pair<std::vector<int>, int> p;
并获取其两个元素的引用:
auto& firstVect = p.first; auto& secondNumber = p.second;
当调用firstVect.emplace_back(someNumber)导致vector发生重分配时,firstVect这个引用是否会失效?已知vector重分配会使其自身的元素引用/迭代器失效,但不清楚嵌套在pair中的vector出现此情况时,对vector对象的引用是否能保留,使用C++17标准。
解答
firstVect是对p.first这个vector对象本身的引用,而非对vector内部存储元素的引用。- vector重分配的本质是:为了容纳更多元素,vector会申请一块新的内存缓冲区,把旧元素拷贝/移动过去,然后释放旧缓冲区。这个过程只会改变vector内部管理的内存地址,但vector对象自身的内存位置(也就是
p.first的位置)完全没有变化。 - 因此,只要
p这个pair对象本身没有被销毁或移动,对p.first的引用firstVect就不会失效,后续依然可以通过它正常操作这个vector对象。 - 需要注意:重分配会导致vector内部元素的引用、迭代器、指针失效,但这和你持有的vector对象引用是完全独立的两回事。
内容的提问来源于stack exchange,提问作者TheMemeMachine
相关产品推荐
相关产品推荐

