如何解决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;
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。