Недавно я наткнулся на этот код в моем коде (упрощен здесь, конечно)Доступ к векторному итератору по индексу?
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);
}
Теперь я заметил, что здесь мы имеем доступ итератор по индексации!
std::shared_ptr<std::string> deletedString = iter[0];
Я никогда не видел, чтобы кто доступ итератора по индексации раньше, так что я могу догадаться, что итератор получает лечение, как указатель, а затем получить доступ к первому элемент указал на указателе. Таким образом, этот код фактически эквивалентен:
std::shared_ptr<std::string> deletedString = *iter;
Или это Неопределенное поведение?
'x [y]' (в данном случае) точно такой же, как '* (x + y)'. Добавление нуля к итератору не меняет его. Поэтому 'iter [0]' совпадает с '* iter'. –