В обсуждался вопрос о том, является ли следующий код законным С++:
std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // *** Is this undefined behavior? ***
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}
Проблема заключается в том, что erase() приведет к аннулированию рассматриваемого итератора. Если это произойдет до того, как i++ будет оценено, то приращение i, как это, технически undefined, даже если оно работает с конкретным компилятором. Одна из сторон дискуссии гласит, что все аргументы функции полностью оцениваются до вызова функции. Другая сторона говорит: "Единственными гарантиями являются то, что я ++ будет происходить до следующего оператора и после использования я ++. Идет ли это до стирания (i ++) или впоследствии зависит от компилятора".
Я открыл этот вопрос, чтобы, надеюсь, решить эту дискуссию.
