我正在阅读关于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);
调用赋值运算符。
答案 0 :(得分:1)
这里的问题是右值引用(T&&
)只能绑定到右值。
并且非常量左值引用(T&
)只能绑定到左值。但是总有可能使用const T&
,由于历史原因,它可以绑定到右值和左值。
这就是为什么你可以将字符串文字传递给const std::string&
。