我知道BOOST_FOREACH的“吊装”pitfall,它缓存了结束迭代器。但似乎:
显然,在这些情况下,人们通常只是手工编写循环,但我的问题是:
到目前为止,我找不到一个。
注意:是为了回应Steve Jessop而编辑的
答案 0 :(得分:3)
“修改序列中间循环是相当常见的”
避免提升不会使宏免受修改问题,因为BOOST_FOREACH也在push_back
可能无效的封面下使用移动迭代器(例如,你正在使用向量并重新分配)或其他结构修改。如果你要与它进行比较的东西不再有效,那么获取一个新的有效end
迭代器并不多。
我提供一些显然有结构修改问题的东西似乎是合理的。陷阱说,“如果这样做会导致迭代器变得无效,请不要这样做。请使用常规for循环。”,而不指定哪些迭代器需要保持有效。如果您的操作可能会破坏任何迭代器,请使用for循环。
提供有时有问题的东西,具体取决于修改的性质,意味着宏必须记录哪些修改是好的,哪些不是(如果只是通过描述隐藏的迭代器并且说,“不要使其失效,但你可以使其他迭代器无效”),这开始变成一个尴尬的API。从一个用户的样本中,100%认为它会免疫,所以我不确定它是一个非常直观的界面。
那就是说,我认为你是正确的BOOST_FOREACH可以很容易地保证它只保存(1)结束迭代器,加上(2)指向当前迭代的迭代器。因此,如果你有一个无葫芦版本,有(2)而不是(1),那么你需要做的就是确保你不会使当前的迭代器无效。我不认为它存在,但是,这个陷阱的作者似乎认为结束迭代器是无效的危险的一部分,而不是试图分离出不同类型的失效。我认为BOOST_FOREACH
旨在作为std::for_each
在Boost.Range上的改进语法,并且符合该目标。你总是可以向相关的Boost人建议它可能不止于此。