为什么它不能在 c++ 中获取迭代器作为引用

Why cannot it get iterator as reference in c++?

本文关键字:迭代器 引用 获取 不能 c++ 为什么      更新时间:2023-10-16

我正在学习c++。我学会了引用可以让我们避免复制。所以我试图获取一个向量的迭代器作为引用来覆盖它的元素。

// simplified function
std::vector<int>::iterator& GetIterator(std::vector<int>& vec) {
    return vec.begin();  // compiler said that here is an error.
}

但是编译器给了我一条错误消息,并建议使用常量引用。我不想使用康斯特。为什么它不能获得非常量引用?或者如何避免复制迭代器?谢谢。

有时可以使用引用来避免复制 - 但这里你需要一个副本。vec.begin()的结果是一个临时的,当你的函数返回时,它就不复存在了。如果您希望函数之外的值 - 并且您确实这样做了 - 则需要副本。(如果你在这里成功地形成了一个引用,它将是一个"悬空的引用",这不是一件好事。

在任何情况下,许多类型都被设计为可以有效地复制,迭代器就是其中之一。事实上,编译器通常可以为您避免复制,而无需您做任何工作 - 这就是其中一种情况。

因此,没有引用的代码更容易、正确且已经是最佳的。

vec.begin();返回一个临时对象并且是 r 值。不能将 l 值引用绑定到 r 值。从函数返回GetIterator后,该临时对象将被销毁,您的引用将被悬挂。

按值(std::vector<int>::iterator)返回,而不是引用。 Iterator被设计为可复制且复制成本低廉。此外,编译器使用返回值优化来避免复制对象的成本。

正确的代码

std::vector<int>::iterator GetIterator(std::vector<int>& vec) {
    return vec.begin();  // compiler said that here is an error.
}

您的&是额外的。

迭代器就像int*一样,得到一个地址
std::vector< type >::iterator就是这样。
所以vector.begin()就像&int,所以你不能把它绑定到iterator&