0

大多数答案,包括这个答案,都指出这std::move并不意味着用于自我分配。
但是,我确实通过 self move assignment在官方参考中看到了可能的实现: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声明:

应该假设唯一可以对移出的对象实例安全执行的操作是通过分配给对象重新初始化或通过调用其析构函数来终止对象的生命周期

看起来重新初始化是完全合法的。

4

1 回答 1

3

这不是自我分配。

一个自我分配将是init = std::move(init);,而你有init = std::move(init) + *first;

于 2020-09-27T08:23:14.890 回答