【发布时间】:2014-12-14 10:54:57
【问题描述】:
我正在研究 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> 类型时会发生什么。
【问题讨论】:
-
没有运行时操作。这只是一种感知的表达方式的变化。这会影响在某些上下文中使用该表达式的操作,可能会导致(特别是重载决议)。
标签: c++ c++11 casting reference perfect-forwarding