【发布时间】:2021-01-13 02:23:04
【问题描述】:
包括this 在内的大多数答案都指出std::move 并不打算用于自我分配。
但是,我确实通过 self move assignment 在官方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移动到operator+而不是operator=。