是否有BOOST_FOREACH的无提升版本
Is there a hoist-free version of BOOST_FOREACH?
我知道BOOST_FOREACH缓存结束迭代器的"提升"陷阱。然而,似乎:
- 修改序列中循环相当常见(特别是push_back)
- 提供一个没有提升的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人员建议,可以比这更多。
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 没有显式声明的int[]中的foreach
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- c++使用foreach使数组为null
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 从预处理器获取 Windows 版本(C++ Win32)
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本