C++20 std::move 自赋值
C++20 std::move in self assignment
大多数答案,包括 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 指出:
it should be assumed that the only operations that may be safely performed on a moved-from object instance are reinitialization through assignment into the object or terminating the lifetime of the object by invoking its destructor
看起来重新初始化是完全合法的。
这不是 self-assignment。
A self-assignment 将是 init = std::move(init);
,而您有 init = std::move(init) + *first;
。
大多数答案,包括 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 指出:
it should be assumed that the only operations that may be safely performed on a moved-from object instance are reinitialization through assignment into the object or terminating the lifetime of the object by invoking its destructor
看起来重新初始化是完全合法的。
这不是 self-assignment。
A self-assignment 将是 init = std::move(init);
,而您有 init = std::move(init) + *first;
。