C++20标准::移入自赋值

C++20 std::move in self assignment

本文关键字:赋值 移入 C++20 标准      更新时间:2024-05-09

包括这一个在内的大多数答案都指出std::move不应该用于自我分配
然而,我确实通过自移动任务在官方参考中看到了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;