如何在向量内有一对带有参考的对?
How can I have a pair with reference inside vector?
我真的需要在内部使用引用(&
)来std::vector
std::pair
,但是当我尝试push_back
引用值时,它会在函数内部中断。调试后,我发现引用地址与unique_ptr
内部的地址不同(但值相同)。
当我不使用(这里是 foo())任何插入向量的函数时,它引用的值是正确的,但地址仍然不匹配。
#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 );
其中V1
和V2
分别是std::decay<T1>::type
和std::decay<T2>::type
。
这意味着您的make_pair<const int&, int>
调用不会真正生成以引用作为其第一个元素的对(与您显然认为的相反)。他们实际上生产pair<int, int>
类型的临时。此时,您将失去对存储在unique_ptr
中的原始int
对象的任何附件。
当您将这些pair<int, int>
临时变量传递给push_back
时,它们会被隐式转换为pair<const int&, int>
类型的临时变量,这是向量的元素类型。通过此机制,您可以将向量元素内的引用附加到make_pair
生成的pair<int, int>
临时int
成员(而不是存储在unique_ptr
中的int
对象)。一旦临时到期,引用就会变酸。
在这种情况下,您可以通过完全避免make_pair
并简单地直接构造std::pair
正确类型的对象来消除此特定问题,例如
vector.push_back(std::pair<const int&, int>(*ptr, 11));
但稍后可能会遇到由原始引用引起的其他问题。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 如何将向量分配给参考变量?
- 使用指针向量到参考向量是非法的吗?
- 如何通过参考传递向量的静态向量
- 如何通过参考构建向量的子句法
- Lambdas的C 向量 - 未定义的参考
- 将std ::向量作为指针参考
- 如何在向量内有一对带有参考的对?
- 调用clear()后,向量的元素仍然可以参考
- 替代STD ::向量存储参考而不是对象的副本
- 传递向量作为参考的正确方法是什么
- 通过参考C 传递向量
- 明确给出该数字时,我应该参考std ::向量大小
- 初始化向量通过参考
- C 地图向量参考错误
- 将STD向量作为参考:无匹配函数要呼叫
- 参考对象的向量
- C++ 向量运算符 [] 参考