Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
交换对象时的交换功能不';t实现移动语义 阅读C++中的移动语义,遇到以下动机: template<class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); } 模板 无效掉期(T&a、T&b) { T tmp(std::move(a)); a=标准::移动(b); b=标准::移动(tmp); }_C++_C++11_Move Semantics - Fatal编程技术网

交换对象时的交换功能不';t实现移动语义 阅读C++中的移动语义,遇到以下动机: template<class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); } 模板 无效掉期(T&a、T&b) { T tmp(std::move(a)); a=标准::移动(b); b=标准::移动(tmp); }

交换对象时的交换功能不';t实现移动语义 阅读C++中的移动语义,遇到以下动机: template<class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); } 模板 无效掉期(T&a、T&b) { T tmp(std::move(a)); a=标准::移动(b); b=标准::移动(tmp); },c++,c++11,move-semantics,C++,C++11,Move Semantics,这里说,如果T不实现移动语义(在复制构造函数和赋值运算符中),那么交换将作为“正常”交换: template<class T> void swap(T& a, T& b) { T tmp(a); a = b; b = tmp; } 模板 无效掉期(T&a、T&b) { T-tmp(a); a=b; b=tmp; } 为什么是这样?据说(最后一段),因为std::move(b)是右值,所以在执行a=std::move(b)时,我们不能调用带有签

这里说,如果T不实现移动语义(在复制构造函数和赋值运算符中),那么交换将作为“正常”交换:

template<class T>
void swap(T& a, T& b) 
{ 
  T tmp(a);
  a = b; 
  b = tmp; 
}
模板
无效掉期(T&a、T&b)
{ 
T-tmp(a);
a=b;
b=tmp;
}

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

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


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

,这就是为什么应该使用
Type&operator=(const Type&)