【发布时间】:2011-12-09 18:55:51
【问题描述】:
我试图了解C++03 emulation of unique_ptr 是如何实现的。 unique_ptr 很像 std::auto_ptr 但更安全。在 auto_ptr 隐式转移所有权(即静默)的情况下,它会吐出编译器错误。例如,一个简单的分配。函数move 是模拟 unique_ptr 安全性的关键。
问题:
- 为什么会有三个移动函数?
-
接受引用并将其转换为右值的第三个移动函数实现(简化)如下。
T move(T &t) { return T(detail_unique_ptr::rv<T>(t)); }
在上面的代码中,对 T 的显式转换似乎是不必要的。事实上,Visual Studio 2010 在没有显式转换为 T 的情况下非常满意。
T move(T &t) {
return detail_unique_ptr::rv<T>(t);
}
g++、clang、Comeau,然而,不喜欢第二个版本。这些编译器抱怨unique_ptr<T> 没有将detail_unique_ptr::rv<T> 作为参数的构造函数。这是为什么? unique_ptr 已经定义了一个将detail_unique_ptr::rv<T> 作为参数的(非显式)构造函数。为什么那个不是自动拾取的?
【问题讨论】:
-
分页@HowardHinnant,上述代码的作者...
标签: c++ move-semantics unique-ptr c++03