В обсуждался вопрос о том, является ли следующий код законным С++:
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 ++) или впоследствии зависит от компилятора".
Я открыл этот вопрос, чтобы, надеюсь, решить эту дискуссию.