私はちょうどstd::move()
の論理を完全に理解していません。std :: move()は値をRValuesにどのように転送しますか?
まず、私はそれを見つけましたが、その構造の仕組みではなく、std::move()
の使用方法に関する文書しかないようです。
私はテンプレートメンバーの機能を知っていますが、VS2010のstd::move()
定義を調べると、それはまだ混乱しています。
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);
}
あなたは以下を参照のように私は
// main()
Object obj1;
Object obj2 = std::move(obj1);
、関数を呼び出すとき、それは基本的に
// std::move()
_Ty&& _Arg = Obj1;
に等しいので、どのような私には最初奇妙であることは、パラメータ、(_Ty & & _Arg)であります
あなたが知っているように、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++に関する基本的な構文スキルの欠如のためです。 私は、これらが徹底的にどのように働いているのか、そして私がインターネットで手に入れることができる文書が歓迎される以上のことを知りたいと思います。 (あなたがこれを説明することができれば、それも素晴らしいでしょう)。
"これは私のC++に関する基本的な構文スキルの欠如のためです。"それから、あなたはそれがどのように機能するかを知る準備ができていません。あなたが知る必要があるのは、ムーブコンストラクタを書く方法と、何かを動かすときに 'std :: move'をいつどのように使うのかです。このプロセスの詳細、つまりC++ 11がこのプロセスを動作させるために使用した_ "深い魔法" _は、あなたが心配する必要があるものではありません。あなたは、すべての機能を実現する機能の特定のやりとりを理解するための知識の基礎を持っていないだけです。 –
Nicol Bolasが言ったこと。あなたが基本的なスキルが不足していることを知っているなら、それは最初に修正する必要がある問題です。あなたはstd :: moveを理解できません。 –
@ NicolBolasそれどころか、質問自体は、OPがその声明の中で自分自身をアンセートしていることを示しています。それは正確には、彼らが質問をすることさえできる基本的な構文スキルのOPの*把握*です。 –