问题描述
大多数答案(包括this个答案)都指出std::move
并不用于自我分配。
但是,我确实通过自我移动分配在官方reference中看到了accumulate
的可能的实现:
template<class InputIt,class T>
constexpr // since C++20
T accumulate(InputIt first,InputIt last,T init)
{
for (; first != last; ++first) {
init = std::move(init) + *first; // std::move since C++20
}
return init;
}
仅从C ++ 20开始才安全吗?内部正在发生什么?
EXP63-CPP指出:
看起来重新初始化是完全合法的。
解决方法
这不是自我分配。
自我分配为init = std::move(init);
,而您有init = std::move(init) + *first;
。