c++ - 我怎样才能在 vector 中有一对引用?

标签 c++ pointers vector reference unique-ptr

我真的需要制作 std::vector of std::pair with reference (&) inside,但它在当我尝试 push_back 引用值时的功能。调试后发现,reference 的地址和 unique_ptr 里面的地址不一样(但是值是一样的)。

当我不使用(这里是 foo())任何插入 vector 的函数时,它引用的值是正确的,但地址仍然不匹配。

#include <iostream>
#include <memory>
#include <iterator>
#include <string>
#include <vector>

void foo(std::vector<std::pair<const int&, int> >& vector,         
std::unique_ptr<int>& ptr) {
    vector.push_back(std::make_pair<const int&, int>(*ptr, 11));
}

int main() {
    std::vector<std::pair<const int&, int> > v;
    std::unique_ptr<int> i = std::make_unique<int>(1);
    std::unique_ptr<int> b = std::make_unique<int>(0);   
    foo(v, i);
    v.push_back(std::make_pair<const int&, int>(*b, 10));
    std::cout << v.size() << ": ";
    for (auto x : v) {
        std::cout << x.first << ",";
    }
    std::cout << "\n";
}

此代码演示了问题 - 而不是 "2: 1,0," 它输出 "2: -342851272,0,"(或类似的大负数首先)。

问题出在哪里?

最佳答案

自 C++14 起 std::make_pair定义为

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );

哪里V1V2std::decay<T1>::typestd::decay<T2>::type分别。

这意味着您的 make_pair<const int&, int>调用并没有真正产生以引用作为第一个元素的对(与您显然相信的相反)。他们实际上生产了 pair<int, int> 的临时文件类型。此时您丢失了原始 int 的所有附件。存储在您的 unique_ptr 中的对象.

当你通过这些 pair<int, int>临时push_back ,它们被隐式转换为 pair<const int&, int> 的临时对象类型,这是您的 vector 的元素类型。通过这种机制,您可以将 vector 元素内的引用附加到 int。那些成员pair<int, int> make_pair 生产的临时产品(不是存储在你的 int 中的 unique_ptr 对象)。一旦临时文件过期,引用就会变质。


在这种情况下,您可以通过避免 make_pair 来消除此特定问题。干脆直接构建std::pair正确类型的对象,例如

vector.push_back(std::pair<const int&, int>(*ptr, 11));

但稍后您可能会遇到由原始引用引起的其他问题。

关于c++ - 我怎样才能在 vector 中有一对引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130025/

相关文章:

c++ - 从 CMake 生成的 Boost 序列化 : Linker errors in XCode 5 project,(带最小完整示例)

c++ - 除以 unsigned long long

c++ - 如何使用 C++ 成员函数作为 C 框架的回调函数

c - 功能参数差异

c++ - 在 C++ 中将字节数组转换为 unsigned long

c++ - 更改 LLVM 函数的名称

c++ - *&C程序中的指针

r - 如何提取向量变量的顶行

Java: vector 的大小(以字节为单位)

c++ - 如何在 C++ 中定义可变大小的 vector