我只是对刚刚添加到最新的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;
}认为基本上没有区别是正确的吗?嗯,我很确定我是对的,但我也知道,过于自信总是适得其反。
提前感谢!
发布于 2011-09-22 10:59:20
std::move被定义为一个专门的类型转换:
static_cast<typename remove_reference<T>::type&&>(t)如果你真的想这样做,你可以这样做。但是,如果你只使用std::move,那么你所做的事情就会变得更短,每个人都会明白你在做什么。关于&& casting的规则很奇怪,所以最好只使用move和forward,如果你是这个意思的话。
发布于 2011-09-22 11:01:22
在功能上没有区别,但在可读性上有区别。
正如while循环比goto更好,C++样式转换比C样式转换更好,std::move比转换更好,因为它是一个不太通用的工具,因此更容易理解它正在做什么,而不需要进一步研究代码的结构。
发布于 2011-09-22 11:00:40
是的,std::move在功能方面什么也不做。其目的是将左值转换为x值,从而使结果可移动。它比使用强制转换更好,因为它清楚地说明了目的。
https://stackoverflow.com/questions/7509050
复制相似问题