通过索引访问矢量迭代器?

And*_*dyG 2 c++ iterator random-access dereference c++11

最近我在我的代码库中遇到了这个代码(当然是简化的)

auto toDelete = std::make_shared<std::string>("FooBar");
std::vector<decltype(toDelete)> myVec{toDelete};
auto iter = std::find_if(std::begin(myVec), std::end(myVec), 
   [](const decltype(toDelete) _next)
   {
      return *_next == "FooBar";
   });

if (iter != std::end(myVec))
{
   std::shared_ptr<std::string> deletedString = iter[0];
   std::cout << *deletedString;
   myVec.erase(iter);
}
Run Code Online (Sandbox Code Playgroud)

在线示例

现在,我注意到我们在这里通过索引访问迭代器!

std::shared_ptr<std::string> deletedString = iter[0];
Run Code Online (Sandbox Code Playgroud)

我以前从未见过有人通过索引访问迭代器,所以我可以猜到的是迭代器被视为指针,然后我们访问指向指针的第一个元素.那么代码实际上相当于:

std::shared_ptr<std::string> deletedString = *iter;
Run Code Online (Sandbox Code Playgroud)

或者是未定义的行为?

use*_*ica 5

从RandomAccessIterator 的cppreference文档:

表达: i[n]

操作语义: *(i+n)

由于std::vector迭代器满足RandomAccessIterator的要求,因此索引它们等同于添加和解除引用,就像普通指针一样.iter[0]相当于*(iter+0),或*iter.