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)
第二个。我知道这是一个非常人工的代码构造,但我可以想象,有真实的用例。