右值引用、复制和移动

Rvalue references, copy and move

考虑以下代码部分进行交换:

//for some type T
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

和下面这个:

//for some type T
void swap(T& a, T& b) {
    T temp = static_cast<T&&>(a);
    a = static_cast<T&&>(b);
    b = static_cast<T&&>(temp);
}

我有以下疑问: 它们之间有什么区别?我的意思是为什么第一次交换比第二次交换更贵?

参考:C++编程语言7.7.2

What is the difference between them? I mean why the first swap is more expensive than the second one ?

第二个为支持它的类型启用移动(即具有移动赋值运算符)。这些类型包括标准向量、字符串等。

对于不支持move语义的基本类型(int、bool等),没有区别,都是普通的copy。