【发布时间】:2016-07-12 10:21:44
【问题描述】:
我真的很想了解 std::move() 函数的内在细节。
此处所述的 std::move() 代码:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics。
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
为什么这段代码返回一个右值引用?该参数是类型 T 右值引用。 a 是否评估右值引用指向的对象,从而将右值引用返回给该对象?另外,为什么需要remove_reference<T> 部分?
教程也写了
这个 move() 给它的目标它的参数的值,但不是 有义务保护其来源的价值。所以,对于一个向量,move() 可以合理地预期将其论点作为零容量 向量以避免复制所有元素。换句话说,移动 是具有潜在破坏性的读取。
但是据说
move 函数确实做的很少。所有的举动都是 接受左值或右值参数,并将其作为右值返回 不会触发复制构造。
这是否应该被理解为,std::move() 可以首先“清空”对象(在本例中为 std::vector),然后将对象作为右值返回(根据 C++ 规范)?但是,官方的 std::move() 是否完全按照后面引用中的说明进行操作?
为什么说 std::move() 在返回右值引用时返回右值?
【问题讨论】:
-
您正在阅读 2006 年的论文,该论文使用的语言不是 C++11。看一个真正的 C++11 实现中
std::move的定义。 -
您还将值类别(右值)与类型(右值引用)混淆了。
std::move返回一个右值(xvalue),它是对T的右值引用。 -
@Barry:值的类型永远不是引用。正确的说法是
move返回一个remove_reference_t<T>类型的xvalue -
参数是T型右值引用 it's not
-
@KerrekSB 你是对的。有时候我觉得 C++ 就是这么简单。