Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
C++ 右值引用、复制和移动_C++_C++11_C++14_Rvalue Reference_Rvalue - Fatal编程技术网

C++ 右值引用、复制和移动

C++ 右值引用、复制和移动,c++,c++11,c++14,rvalue-reference,rvalue,C++,C++11,C++14,Rvalue Reference,Rvalue,考虑交换代码的以下部分: //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&&>(

考虑交换代码的以下部分:

//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);
}
//对于某些类型的T
无效掉期(T&a、T&b){
温度=静态铸件(a);
a=静态铸件(b);
b=静态铸件(温度);
}
我有以下疑问: 他们之间有什么区别?我是说为什么第一次交换比第二次更贵

参考文献:C++程序设计语言7.7.2

他们之间有什么区别?我是说为什么第一次交换比第二次更贵

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


对于不支持移动语义的基本类型(int、bool等),没有区别,这是一个普通副本。

第一个复制三个副本,第二个复制ee移动。一般来说,移动可以比复制更有效地实现,但显然这取决于移动或复制的对象的类型。这完全正确吗?编译器可以进行任何没有副作用的优化。因此a
tpa,b;标准:交换(a,b);a、 foo(b)
可优化为
tpa、b;b、 foo(a)
第二个。我知道这是一个非常人工的代码构造,但我可以想象,有真实的用例。