ptr C ++ 03仿真

我试图了解C ++ 03仿真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似乎没有必要。 事实上,如果没有明确的转换到T,Visual Studio 2010是完美的。

    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>作为参数。 为什么不是自动拾取的?


    原因是你不能用另一个unique_ptr初始化一个unique_ptr而没有进行用户定义的转换(通过将rvalue传递给unique_ptr的rv-taking构造函数来实现rv)。 但是,如果没有明确地调用unique_ptr的ctor(如unique_ptr(...) ),则会执行复制初始化,在您的情况中,首先成功构造一个右值临时unique_ptr,但无法将该临时值复制到返回值目标对象中,因为在该副本中,不允许用户定义的转换(这也被称为原则规则“在初始化中没有两个用户定义的转换”)。 Msvc允许拷贝使用非标准的nonconst unique_ptr引用的ctor。

    当从同一个类的对象中对类进行复制初始化时,不存在这样的两步初始化。 源对象只传递给unique_ptr的非显式构造函数,它将使用rv-taking构造函数将其转换为rv ,并通过该方式成功构造返回值目标对象。

    出于同样的原因,不存在从unique_ptr<Derived>unique_ptr<Base>隐式转换。 在第一步中,将成功创建unique_ptr<Base> ,但是当将该临时文件复制到unique_ptr<Base>目标对象时,不能使用用户定义的转换的限制会阻止成功。

    链接地址: http://www.djcxy.com/p/10239.html

    上一篇: ptr C++03 emulation

    下一篇: Where are "Your Certificates" stored in Firefox?