我对刚刚添加到最新C ++标准中的新函数std :: move()感到有些好奇。
读完一篇关于它的文章,发现函数的定义是
namespace std {
template <class T>
inline typename remove_reference<T>::type&& move(T&& x)
{
return x;
}
}
这似乎与调用std :: move和使用强制转换没有任何区别。
例如,
class NPC{
int m_number1;
int m_number2;
public:
NPC() : m_number1(1), m_number2(2) {
cout << "NPC Constructor called!" << endl;
}
NPC(NPC&& _npc) : m_number1(_npc.m_number1), m_number2(_npc.m_number2) {
_npc.m_number1 = 0;
_npc.m_number2 = 0;
cout << "NPC Move Constructor called!" << endl;
}
};
int main() {
NPC n1;
NPC n2 = std::move(n1);
cout << "----------------" << endl;
NPC n3;
NPC n4 = (NPC&&)n3;
return 0;
}
认为基本上没有区别是对的吗? 好吧,我非常肯定我是对的,但也知道过于自信总是适得其反。
提前致谢!
答案 0 :(得分:9)
std::move
被定义为专业演员:
static_cast<typename remove_reference<T>::type&&>(t)
如果你真的想要可以这样做。但如果你只使用std::move
,那么每个人所做的事情会更短更明显。围绕&amp;&amp;的规则铸造是很奇怪的,所以最好只使用move
和forward
这就是你的意思。
答案 1 :(得分:5)
功能上没有区别,但可读性存在差异。
正如while
循环优先于goto
s,并且C ++样式转换优先于C样式转换,std::move
优先于转换,因为它是 less < / em>通用工具,因此无需进一步研究代码结构就更容易理解它在做什么。
答案 2 :(得分:2)
是的,std::move
在功能方面没有任何作用。其目的是将左值转换为x值,使结果可移动。它比使用演员阵容更好,因为它明确了目的。