交换对象时交换功能不实现移动语义

时间:2017-10-02 15:35:37

标签: c++ c++11 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没有实现移动语义(在复制构造函数和赋值运算符中),那么swap将表现为&#34; normal&#34;交换:

template<class T>
void swap(T& a, T& b) 
{ 
  T tmp(a);
  a = b; 
  b = tmp; 
}

为什么这是真的?它说here(最后一段)因为std::move(b)是右值,我们在执行Type& operator=(Type&)时无法使用签名a = std::move(b);调用赋值运算符。

1 个答案:

答案 0 :(得分:1)

这里的问题是右值引用(T&&)只能绑定到右值。 并且非常量左值引用(T&)只能绑定到左值。但是总有可能使用const T&,由于历史原因,它可以绑定到右值和左值。

这就是为什么你可以将字符串文字传递给const std::string&