使用时的坑:
std::list<int> listObj {1, 2, 3, 4, 5};
auto itEnd = listObj.end();
itEnd++;
assert(itEnd == listObj.begin()); // Ok
assert(itEnd == listObj.end()); // crash
上面代码中,itEnd在被赋予listObj.end()后仍然可以自增,移动为listObj.begin(),因此std::advance的距离参数若大于listObj.size(),则advance会从头开始再次移动,而不是抛出异常或固定为listObj.end()