是否有BOOST_FOREACH的无提升版本

Is there a hoist-free version of BOOST_FOREACH?

本文关键字:版本 FOREACH BOOST 是否      更新时间:2023-10-16

我知道BOOST_FOREACH缓存结束迭代器的"提升"陷阱。然而,似乎:

  1. 修改序列中循环相当常见(特别是push_back)
  2. 提供一个没有提升的BOOST_FOREACH版本并不难,因此对修改问题免疫。

显然,在这些情况下,人们通常只是手工编写循环,但我的问题是:

  • 这样的版本存在吗?比如BOOST_FOREACH_NOHOIST之类的。

到目前为止我还没有找到。

注:回复Steve Jessop编辑

"在循环中修改序列是相当常见的"

避免提升并不会使宏不受修改问题的影响,因为BOOST_FOREACH也在底层使用移动迭代器,这可能会被push_back(例如您正在使用矢量并重新分配)或其他结构修改无效。如果你要比较的东西不再有效,那么获得一个新的有效的end迭代器就没有多大意义了。

对我来说,提供明显在结构修改方面有问题的东西似乎是合理的。陷阱说,"如果这样做会导致迭代器失效,就不要这样做。使用常规的for循环代替。",而不指定迭代器需要保持有效。如果你的操作可能破坏任何迭代器,使用for循环。

提供一些有时有问题的东西,这取决于修改的性质,这意味着宏必须记录哪些修改是可以的,哪些是不可以的(如果只是通过描述隐藏的迭代器并说,"不要使它无效,但你可以使其他迭代器无效"),这开始成为一个尴尬的API。从一个用户的样本来看,100%的人认为它是免疫的,所以我不确定这是一个非常直观的界面。

也就是说,我认为你是对的,BOOST_FOREACH可以很容易地保证它只保存(1)结束迭代器,加上(2)指向当前迭代器的迭代器。因此,如果你有一个无提升的版本,有(2)但没有(1),那么你所需要做的就是确保你没有使当前迭代器无效。但是,我不认为它存在,这个陷阱的作者似乎认为end迭代器是无效危险的所有部分,而不是试图区分不同类型的无效。我认为BOOST_FOREACH是作为std::for_each在Boost上的改进语法。范围,并达到目标。你可以随时向相关的Boost人员建议,可以比这更多。