问题
在C++中使用引用访问vector元素,结果与预期不符。
复现
简单还原代码如下
#include <iostream>
#include <vector>
class data
{
public:
std::vector<int> Get() const
{
return vec;
}
private:
std::vector<int> vec = {1,2,3,4};
};
int main()
{
data dat;
auto const& a = dat.Get()[1];
auto const& b = dat.Get()[2];
std::cout << "a = " << a << ", b = " << b << std::endl;
return 0;
}
运行结果
a = 0, b = 1433763856
思考
上述代码中Get()
函数返回vector为临时拷贝, 且没有一个有效的引用确保其存活。
而a
赋值为临时vector中的元素不算做vector的有效引用,故临时vector在该行结束时被析构。
此时a,b
变为悬空引用(dangling references),行为无法确定。
解决
修改方法包括但不限于:
- 将
data::Get()
函数返回值类型改为vector<int>&
- 将
Get()
返回值赋给一个变量x
使其存活并调用x[1]
- 将
a,b
声明为普通变量auto const
产生deep copy