交换对象不实现移动语义时的交换函数

swap function when swapped object don't implement move semantics

本文关键字:交换 函数 语义 移动 对象 实现      更新时间:2023-10-16

我正在阅读有关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&