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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...