我只是发现自己不完全了解的逻辑std::move()
。
起初,我在Google上进行了搜索,但似乎只有有关如何使用的文档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/…。