STDの変形のために、次のコードがある::スワップ():std :: swap()の理解。 tr1 :: _ Remove_referenceの目的は何ですか? VS10のSTLの実装では
// TEMPLATE FUNCTION _Move
template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&&
_Move(_Ty&& _Arg)
{ // forward _Arg as movable
return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
}
// TEMPLATE FUNCTION swap (from <algorithm>)
template<class _Ty> inline
void swap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
_Ty _Tmp = _Move(_Left);
_Left = _Move(_Right);
_Right = _Move(_Tmp);
}
キャスト_moveで(typename tr1::_Remove_reference<_Ty>::_Type&&)
(のは)私の質問の源です。 _Remove_referenceは何をするん
// TEMPLATE _Remove_reference
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
};
、そしてなぜこの文脈_Remove_reference
で
は、次のように定義されて? さらに、& &は何をしていますか?
非常に素晴らしいありがとう。私はそれを愛する。私は移動のセマンティクスについて読む、コピーおよびスワップイディオム、および右辺値参照。すべてを例外的な安全性とコードの削減を除けば、パフォーマンス上のメリットがありますか? –
あなたの最初の2つの質問に。はい、あなたは正しいです、そして、私はテンプレートメタプログラミングに精通しています。 –
@マイケル:あなたが何を求めているのか分かりません。移動よりも移動が速いのかどうか聞いていますか?それはタイプによって異なります。タイプに外部リソースがある場合は、移動はコピーよりもはるかに高速です。本質的にすべての動的STLコンテナを考えてください。例えば、 'std :: array'のように、型が "フラット"の場合、移動には性能上のメリットはありません。なぜなら、ポインタのつまずきによって移動できるリソースがないからです。それはあなたの質問に答えますか? –
fredoverflow