【发布时间】:2018-01-27 01:19:20
【问题描述】:
考虑在push_backs 到std::vector 的std::reference_wrappers 的这种尝试:
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int> v_i;
std::vector<std::reference_wrapper<int>> s_i;
for(int i=0;i<10;++i)
{
v_i.push_back(i);
s_i.push_back(std::ref(v_i[i]));
}
std::cout<<v_i[0]<<std::endl;
std::cout<<s_i[0].get()<<std::endl;
return -1;
}
我希望[] 运算符返回对v 的i-th 元素的引用,并且从给定here 的可能实现中,我们可以合理地假设附加到@ 的std::reference_wrapper 对象987654330@ 持有指向正确地址v_i[i] 的指针的副本。但是,上面代码的输出是
0
1980603512 //or some other random garbage value
很明显,在循环内构造的std::reference_wrappers 指向的是临时对象。为什么会发生这种情况,附加到s_i 的正确方法是什么?
顺便说一句,我使用的是g++ 5.4.0(带有-std=c++0x 标志)。
【问题讨论】: