Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 引用包装器不会相应地更改地址_C++_C++11_Stdvector_Memory Address_Reference Wrapper - Fatal编程技术网

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