C++11 当init为string时,在std accumulate中写入lambda的性能方法。

C++11 当init为string时,在std accumulate中写入lambda的性能方法。,c++11,lambda,move-semantics,C++11,Lambda,Move Semantics,我正在实施一些 需要这样的代码 const auto concat = std::accumulate(ints.begin(), ints.end(), string{}, [](string& acc, const int& val) { return string(std::move(acc))+to_string(val);}); 2个问题: 1) 从acc移动是否安全? 2) 它比使用const string&acc参数快吗?即使这样也应该是安全的,我相信:[](s

我正在实施一些 需要这样的代码

const auto concat = std::accumulate(ints.begin(), ints.end(), string{}, 
[](string& acc, const int& val) { return string(std::move(acc))+to_string(val);});
2个问题:
1) 从acc移动是否安全?

2) 它比使用
const string&acc
参数快吗?

即使这样也应该是安全的,我相信:
[](string&acc,int val)->string&{acc+=to_string(val);return acc;}
根本没有复制或移动(好吧,有自我分配,这可能是优化的,也可能不是优化的)。[累积]/1表示
std::acculate
必须通过执行
acc=binary_op(acc,*i)
来更新累加器,但没有表示
binary_op
不得在内部修改
acc
(这意味着,是的,从
acc
移动也应该是安全的)。@IgorTandetnik标记为not-a-comment。(开玩笑,但为什么不回答?)接受评论:)即使这样也应该是安全的,我相信:
[](string&acc,int-val)->string&{acc+=to_string(val);return acc;}
根本没有复制或移动(好吧,有自我分配,这可能会优化,也可能不会优化)。[累积]/1表示
std::acculate
必须通过执行
acc=binary_op(acc,*i)
来更新累加器,但没有表示
binary_op
不得在内部修改
acc
(这意味着,是的,从
acc
移动也应该是安全的)。@IgorTandetnik标记为not-a-comment。(开玩笑,但为什么不回答?)接受评论:)