我想了解以下代码的问题。它可以编译,但不能按预期工作。
#include <iostream>
#include <vector>
class A
{
public:
std::vector<int> getVector() { return m_vector; }
std::vector<int> m_vector = {1, 2, 3};
};
int main()
{
A objA;
for(int i = 0; i < objA.getVector().size(); i++)
{
int &item = objA.getVector().at(i);
std::cout << "\nvector item: " << item;
}
return 0;
}
输出:
预期输出:
我知道没有必要将该项目声明为参考,但是我想了解这样做后出现的问题。
我认为问题在于引用项需要左值,而方法std :: vector :: at返回引用。由于方法std :: vector :: at的返回类型为int&,因此编译不会引发任何错误,但结果将不符合预期。
是否有可能确认这是问题所在,并且我没有什么其他的遗漏?
getVector()
返回std::vector
值。因此,objA.getVector().at(i)
在一个临时对象上调用.at(i)
。
.at
返回给定位置上元素的引用。 int &item
绑定到此引用的元素临时对象。
行后
int &item = objA.getVector().at(i);
临时std::vector
被销毁,并且item
所引用的元素也随之被销毁。
因此使用该引用然后输入
std::cout << "\nvector item: " << item;
导致未定义的行为,因为item
所引用的对象不再存在。
这可以通过从getVector
返回引用来解决,在这种情况下item
将引用std::vector
的objA
成员中的元素,而不是它的临时副本。