c++ 不理解std::iterator在列表初始化中的工作原理[重复]

fslejnso  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(95)

此问题在此处已有答案

What is a dangling reference? [duplicate](1个答案)
3天前关闭。
我在使用std::vector::iterator时遇到了问题。首先,我定义了一个struct

template <typename T>
struct VecIter {
  VecIter(std::vector<T>::iterator &&it_, size_t remain_):
    it(it_), remain(remain_) {}

  std::vector<T>::iterator &it;
  size_t remain;

  T& operator * () {
    return *it;
  }
};

字符串
它只是一个常规迭代器的 Package 器。下面是一个测试类:

template <typename T>
class testA {
  public:
    testA(std::vector<T> &a) {
      stack.push_back({a.begin(), a.size()});
    }

    std::vector<VecIter<T>> stack;
};


构造函数接受std::vector作为输入,并初始化我们的迭代器 Package 器。下面是测试部分:

TEST(TestIterator, test_iter_in_stack) {
  std::vector<int> a{3, 2, 1};

  testA<int> sol(a);
  auto x = sol.stack[0];
 
  auto it = x.it;  // extract the iterator
  cout << *it << "\n";  // segmentation fault here...
  it++;
  cout << *it << "\n";
}


我的问题是为什么*it会导致分段错误?我怀疑列表初始化stack.push_back({a.begin(), a.size()})没有成功地传递迭代器。
我希望测试应该打印出32。欢迎任何意见。谢谢!

noj0wjuj

noj0wjuj1#

VecIter::it是对a.begin()返回的临时对象的悬挂引用。您应该将std::vector<T>::iterator &it更改为std::vector<T>::iterator it
一般来说,迭代器可能比指针大不了多少,通过引用传递和存储它们可能不是必要的。标准库通常通过值传递它们,例如在std::vector constructor中。

相关问题