の論理を完全に理解していないことに気づきました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 ++に関する基本的な構文スキルが不足しているためです。これらがどのように機能するかを知りたいのですが、インターネットで入手できるドキュメントは歓迎されます。(もしあなたがこれを説明できるなら、それも素晴らしいでしょう)。
move
実装方法ではなく、動作方法を理解するためにここに来たと思います。この説明は本当に役立つと思います:pagefault.blog/2018/03/01/…。