C++20标准::移入自赋值
C++20 std::move in self assignment
包括这一个在内的大多数答案都指出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;
。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- C++将浮点指针值舍入为小数位数
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 反转按位左移和OR赋值
- c++中的右移赋值是什么意思?
- 将赋值/构造函数移出继承范围