交换对象时的交换功能不';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不实现移动语义(在复制构造函数和赋值运算符中),那么交换将作为“正常”交换:交换对象时的交换功能不';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)时,我们不能调用带有签
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&)