【发布时间】:2013-11-21 11:31:41
【问题描述】:
通过std::transform 的标准文档,我注意到在 C++11 之前,函子参数被要求没有副作用,而从 C++11 开始,要求的限制较少 - “op and binary_op 不应使迭代器或子范围无效,或修改范围中的元素”。见
http://en.cppreference.com/w/cpp/algorithm/transform
和标准的第 25.3.4 节。 cppreference.com 上的网页也提到“这些要求的目的是允许 std::transform 的并行或无序实现”。
我不明白这段代码的 sn-p 在 C++11 中是否合法:
std::vector<int> v(/* fill it with something */), v_transformed;
int foo = 0;
std::transform(v.begin(),v.end(),std::back_inserter(v_transformed),[&foo](const int &n) -> int {
foo += 1;
return n*2;
});
显然,如果 std::transform 在幕后并行化,我们将有多个并发调用 foo += 1,这将是 UB。但函子本身似乎并没有违反标准中列出的要求。
这个问题可以问其他标准算法(除了我认为std::for_each,它明确指出要按顺序执行迭代)。
我是不是误会了什么?
【问题讨论】:
-
我刚刚使用 gcc 4.8.2 生成了这个程序集,没有优化和
-O2巨大的差异 -
LWG issue 293 几乎是你的问题.. 但被关闭为 NAD