C++ unique#ptr C++;03仿真
我正在试图理解它是如何实现的。unique_ptr与std::auto_ptr非常相似,但更安全。如果auto_ptr会隐式地(即静默地)转移所有权,那么它会抛出编译器错误。例如,一个简单的赋值。功能C++ unique#ptr C++;03仿真,c++,move-semantics,unique-ptr,c++03,C++,Move Semantics,Unique Ptr,C++03,我正在试图理解它是如何实现的。unique_ptr与std::auto_ptr非常相似,但更安全。如果auto_ptr会隐式地(即静默地)转移所有权,那么它会抛出编译器错误。例如,一个简单的赋值。功能move是仿真独特ptr安全性背后的关键 问题: 为什么有三个移动功能 第三个move函数接受引用并将其转换为右值,实现(简化)如下 T move(T &t) { return T(detail_unique_ptr::rv<T>(t)); } T移动(T&T){ 返回
move
是仿真独特ptr安全性背后的关键
问题:
T move(T &t) {
return T(detail_unique_ptr::rv<T>(t));
}
T移动(T&T){
返回T(细节、唯一性、ptr::rv(T));
}
T move(T &t) {
return detail_unique_ptr::rv<T>(t);
}
T移动(T&T){
返回详细信息\u唯一\u ptr::rv(t);
}
但是,g++、clang、Comeau不喜欢第二个版本。这些编译器抱怨说,
unique\u ptr
没有构造函数将detail\u unique\u ptr::rv
作为参数。为什么呢?unique\u ptr已经定义了一个(非显式)构造函数,该构造函数将detail\u unique\u ptr::rv
作为参数。为什么不能自动拾取该值?原因是,如果不进行用户定义的转换(到rv,通过将rv值传递给使用unique ptr的rv构造函数),就无法使用另一个unique ptr初始化unique ptr。但是,如果不显式调用unique\u ptr
的ctor(如unique\u ptr(…)
),则执行复制初始化,在这种情况下,该初始化首先成功地构造了一个右值临时unique\u ptr,但随后无法将该临时复制到返回值目标对象中,因为在该复制中,不允许用户定义的转换(这也称为原则规则“初始化中不允许有两个用户定义的转换”)。Msvc允许副本使用接受非ST unique_ptr引用的ctor,这是非标准的
当从同一类的对象复制初始化一个类时,没有这样的两步初始化。源对象只是传递给unique\u ptr
的非显式构造函数,该构造函数将使用rv taking构造函数将其转换为rv
,并通过这种方式成功构建返回值目标对象
出于同样的原因,没有从
unique\u ptr
到unique\u ptr
的隐式转换。在第一步中,将成功创建一个unique\u ptr
,但是当将该临时文件复制到unique\u ptr
目标对象时,不能使用任何用户定义的转换的限制会阻止成功。Paging,所述代码的作者…感谢litb!您想告诉我为什么需要另外两个移动功能吗?为什么不直接调用unique\u ptr(detail\u unique\u ptr::rv)
来执行不需要用户定义转换的复制?