C ++ 20 std :: move进行自我分配

问题描述

大多数答案(包括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;