C++ 引用包装器不会相应地更改地址
这个问题是问题的延伸。我知道由于C++ 引用包装器不会相应地更改地址,c++,c++11,stdvector,memory-address,reference-wrapper,C++,C++11,Stdvector,Memory Address,Reference Wrapper,这个问题是问题的延伸。我知道由于push_back()新的内存分配发生,并且std::vector v的第一个元素的地址发生变化,但不应该std::vector v2相应地改变其地址 #include <memory> #include <iostream> #include <vector> #include <functional> int main() { std::vector<int> v; std::vec
push_back()
新的内存分配发生,并且std::vector v
的第一个元素的地址发生变化,但不应该std::vector v2
相应地改变其地址
#include <memory>
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int> v;
std::vector<std::reference_wrapper<int>> v2;
for (int i=0; i<3; ++i)
{
int b = i;
v.push_back(b);
v2.push_back(v.back());
std::cout << "org: " << std::addressof(v[0]) << std::endl;
std::cout << "ref: " << std::addressof(v2[0].get()) << std::endl;
}
return 0;
}
不,引用包装器就像一个指针。当第一个向量重新分配时,内存中的旧int对象被销毁,并且引用包装器指向的int无效。现在使用它是一个错误。当向量调整大小时,引用无效,因此程序具有未定义的行为(当调用
get()
时)。
org: 0x605010
ref: 0x605030
org: 0x605050
ref: 0x605010
org: 0x605030
ref: 0x605070