我发现自己并没有完全理解std::move()
的逻辑。
一开始,我尝试通过Google搜索相关内容,但貌似只有关于如何使用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);
}
对我来说首先很奇怪的是参数 (_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
的工作方式而不是它的实现方式。我发现这个解释非常有用:https://pagefault.blog/2018/03/01/common-misconception-with-cpp-move-semantics/. - Anton Daneyko