【问题标题】:swap function when swapped object don't implement move semantics交换对象不实现移动语义时的交换函数
【发布时间】:2018-03-13 17:15:03
【问题描述】:

我正在阅读 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 将表现为“正常”的 swap:

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

为什么这是真的?据说here(最后一段)因为std::move(b)是右值,所以我们在做a = std::move(b);时不能调用签名为Type&amp; operator=(Type&amp;)的赋值运算符。

【问题讨论】:

  • 这就是为什么你应该使用Type&amp; operator=(const Type&amp;)

标签: c++ c++11 move-semantics


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2022-06-15
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2017-02-23
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多