STL中UnaryOperation、BinaryOperation的引用参数是否保证为原数据元素?
结论:你提供的代码不符合C++标准要求,属于未定义行为
C++标准从未保证STL算法传递给回调的引用参数一定指向原容器的原始元素,具体原因如下:
- 通用STL算法对可调用对象的形参要求仅为:迭代器解引用后的结果可以隐式转换为回调的形参类型,没有强制要求必须直接绑定原元素的引用。实现完全可以合法地选择将元素拷贝为临时变量后再传入回调,例如:
这种场景下你执行// STL内部的transform实现可能存在类似逻辑 T temp = *it; op(temp); // 此时回调里&temp和原容器元素地址无关&v - &arr[0]属于不同数组的指针相减,是标准明确规定的未定义行为。 - 你代码中使用了
std::execution::par并行执行策略,这类并行算法对可调用对象的限制更严格:标准明确禁止用户回调中出现依赖元素内存地址的操作。并行算法的实现为了优化性能,通常会拆分迭代器区间、将部分元素拷贝到临时缓冲区做分块处理,此时传递给回调的参数基本不可能是原容器元素的直接引用。 - 哪怕你去掉并行策略改用串行版本的
std::transform,也不建议依赖“参数是原元素引用”这个特性:部分STL的Debug模式实现会给迭代器加代理包装层,解引用返回的是代理对象的引用,取地址也不会匹配原容器元素的地址,代码完全不可移植。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

