问题
在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