のロジックを完全に理解していないことに気づきましたstd::move()
。
最初はグーグルで検索しましたが、構造がどのように機能するかではなく、使い方に関するドキュメントしかstd::move()
ないようです。
つまり、テンプレートメンバー関数が何であるかは知っていますがstd::move()
、VS2010の定義を調べると、それでも混乱を招きます。
std :: 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);
}
私にとって最初に奇妙なのは、パラメーター(_Ty && _Arg)です。これは、以下に示すように関数を呼び出すと、
// main()
Object obj1;
Object obj2 = std::move(obj1);
それは基本的に等しい
// std::move()
_Ty&& _Arg = Obj1;
しかし、すでにご存知のように、LValueをRValue参照に直接リンクすることはできません。そのため、このようにする必要があると思います。
_Ty&& _Arg = (Object&&)obj1;
ただし、std :: move()はすべての値に対して機能する必要があるため、これはばかげています。
したがって、これがどのように機能するかを完全に理解するには、これらの構造体も確認する必要があります。
template<class _Ty>
struct _Remove_reference
{ // remove reference
typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference<_Ty&>
{ // remove reference
typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference<_Ty&&>
{ // remove rvalue reference
typedef _Ty _Type;
};
残念ながら、それはまだ混乱を招き、私にはわかりません。
これはすべて、C++に関する基本的な構文スキルが不足しているためです。これらがどのように機能するのかを知りたいのですが、インターネットで入手できるドキュメントは大歓迎です。(これを説明できれば、それも素晴らしいでしょう)。