这里的问题是使用右值而不是左值创建的引用吗?

问题描述 投票:0回答:1

我想了解以下代码的问题。它可以编译,但不能按预期工作。

#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;
}

输出:

  • 矢量项目:0
  • 矢量项目:0
  • 矢量项目:3

预期输出:

  • 矢量项目:1
  • 矢量项目:2
  • 矢量项目:3

我知道没有必要将该项目声明为参考,但是我想了解这样做后出现的问题。

我认为问题在于引用项需要左值,而方法std :: vector :: at返回引用。由于方法std :: vector :: at的返回类型为int&,因此编译不会引发任何错误,但结果将不符合预期。

是否有可能确认这是问题所在,并且我没有什么其他的遗漏?

c++ vector lvalue
1个回答
0
投票

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::vectorobjA成员中的元素,而不是它的临时副本。

© www.soinside.com 2019 - 2024. All rights reserved.