Without Move Semantics (C++03)
The source code of std::move
std::move
does not move anything, it just cast the parameter into a r-value, so that it can be bound to a r-value reference.
Class
- declare virtual destructor disable move semantics for all the members for this class
The use of a r-value reference is a l-value
Universal/forwarding Reference
因為 The use of a r-value reference is a l-value,所以
必須明確使用 std::move(x)
才能保持 move semantics。
也因此,我們使用 template 結合 forwarding 來自動達成這件事,因為當參數越來越多時,要手動對這些參數 call move 會很麻煩。
這邊的 T&& x
並不是 r-value reference,而是 l-value, r-value reference 都可以對應,在上面的例子當中就是對應到三個不同的 foo
function。