交换对象不实现移动语义时的交换函数
swap function when swapped object don't implement move semantics
我正在阅读有关C 中移动语义的信息,并遇到以下示例作为动机:
template<class T>
void swap(T& a, T& b)
{
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
在这里说,如果t不实施移动语义(在复制构造函数和作业运算符中),则交换将以"正常"交换来互换:
template<class T>
void swap(T& a, T& b)
{
T tmp(a);
a = b;
b = tmp;
}
为什么是真的?在这里说过(最后一段),由于std::move(b)
是rvalue,因此我们在执行a = std::move(b);
时无法用签名Type& operator=(Type&)
调用任务操作员。
这里的问题是RVALUE参考(T&&
)只能与RVALUE绑定。并且非符合LVALUE参考(T&
)只能与LVALUE结合。但是总有可能使用const T&
,出于历史原因,它可以与RVALUES和LVALUE绑定。
这就是为什么您可以将字符串字面的字母传递给const std::string&
。
相关文章:
- 交换函数不是在 C++ 中交换 2D 数组的元素
- 选择排序时交换函数调用的数量和完成的交换次数是否相同?
- 在C++中使用 4 个交换函数修复程序
- 如何使用Struct打印交换函数
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 从递归向后选择排序函数调用 max 和交换函数
- 使用通用交换函数来缩短代码
- 快速排序中的交换函数给出错误的输出
- 为什么每个STL容器都具有将其定义为成员函数的交换函数
- 使用交换函数交换元素是可以的吗?
- 传递参数、参数、交换函数和随机数生成器
- 如何在这个交换函数(一个单独的链表)中找到错误
- 左值和右值引用的交换函数
- 使用指针的交换函数
- 排序算法的交换函数不适用于排序函数中的参数。
- 为什么使用std::swap不会在外部范围中隐藏其他交换函数
- 交换对象不实现移动语义时的交换函数
- 我如何制作constexpr交换函数
- 在c++中编写交换函数以重新分配结构数组中的成员值
- std::排序和自定义交换函数