C++ unique#ptr C++;03仿真

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){ 返回

我正在试图理解它是如何实现的。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){
    返回T(细节、唯一性、ptr::rv(T));
    }
    
  • 在上面的代码中,显式转换为T似乎是不必要的。事实上,VisualStudio2010在没有显式转换到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)
    来执行不需要用户定义转换的复制?