从左值引用到右值的C ++转换引用unique_ptr

时间:2014-12-14 10:54:57

标签: c++ c++11 casting reference perfect-forwarding

我正在研究C ++中的完美转发机制,我对std::move()函数有一些疑问。这是一种可能的实现方式:

template<class T> 
typename remove_reference<T>::type&&
std::move(T&& a) noexcept {
  typedef typename remove_reference<T>::type&& RvalRef;
  return static_cast<RvalRef>(a);
}

std::unique_ptr<>上使用时,此函数将资源的所有权从一个指针传输到另一个指针。 我发现这个函数的焦点是从左值引用到推导的T类型的右值引用的转换。

#include <iostream>
#include <memory>
using namespace std;
int main() {
    unique_ptr<int> p1(new int(20));
    unique_ptr<int> p2;
    unique_ptr<int> &r = p1;

    cout << "p1 = " << p1.get() << endl;
    cout << "p2 = " << p2.get() << endl;

    // These 2 instructions produce the same effect (then consider just one of them).
    p2 = static_cast<unique_ptr<int>&&>(r);
    //p2 = move(p1);

    cout << "p1 = " << p1.get() << endl;
    cout << "p2 = " << p2.get() << endl;

    return 0;
}

输出:

p1 = 0x467b10
p2 = 0
p1 = 0
p2 = 0x467b10

我想知道当我从L引用转换为R引用std::unique_ptr<int>类型时会发生什么。

1 个答案:

答案 0 :(得分:4)

std::move不动,std::forward不转发。

move只是将一种引用转换为另一种引用。它接受一个引用,并返回对相同数据的右值引用。这在运行时没有任何作用。移动是使用此右值引用的代码。

现在告诉我们这个代码就像对待一个临时未命名的对象一样对待这个代码&#39; (不完全,但很接近)。最常见的消费者是移动构造函数&#34;或者&#34;移动作业&#34;,这是与unique_ptr实际移动的内容。

对于forward,它是一个条件移动,定义为使用称为“完美转发”的技术。和/或“通用参考”#。它有时会移动,有时什么都不做。我只提到它,因为我上面引用的精辟说法提到它:这是另一个话题。