vendredi 29 avril 2016

Accessing a vector iterator by index?

Recently I came across this code in my codebase (Simplified for here, of course)

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

Online Example

Now, I noticed that here we are accessing an iterator by indexing!

std::shared_ptr<std::string> deletedString = iter[0];

I've never seen anyone access an iterator by indexing before, so all I can guess at is that the iterator gets treated like a pointer, and then we access the first element pointed to at the pointer. So is that code actually equivalent to:

std::shared_ptr<std::string> deletedString = *iter;

Or is it Undefined Behavior?

Aucun commentaire:

Enregistrer un commentaire