2011-12-24 80 views
10

我想擦除當前在基於範圍的for循環內使用的容器中的元素。這會導致未定義的行爲?或者如果我沒有撥打erase(),那麼在erase()之後element的下一個值應該是下一個元素應該是什麼?在基於範圍的for循環內擦除容器中的元素

實施例:

std::map<int, int> someMap; 
/* Fill in someMap */ 
for (auto& element : someMap) 
{ 
    /* ... */ 
    if (/* Some condition */) 
     someMap.erase(element.first); 
} 

回答

12

它應該是一個未定義的行爲。因爲根據14882/2011,基於範圍的聲明相當於:

auto && __range = range-init; 
for (auto __begin = begin-expr(__range), 
    __end = end-expr(__range); 
    __begin != __end; 
    ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
}