C++ - 这里是否有从Fred*到auto_ptr <Fred>的隐式转换?

q09*_*987 4 c++ smart-pointers auto-ptr

我看到以下代码,

#include <new>
#include <memory>
using namespace std;

class Fred;  // Forward declaration
typedef  auto_ptr<Fred>  FredPtr;

class Fred {
public:
  static FredPtr create(int i)
  { 
    return new Fred(i); // Is there an implicit casting here? If not, how can we return
                        // a Fred* with return value as FredPtr?
  }
private:
  Fred(int i=10)      : i_(i)    { }
  Fred(const Fred& x) : i_(x.i_) { }
  int i_;
};
Run Code Online (Sandbox Code Playgroud)

请参阅功能创建中列出的问题.

谢谢

//根据评论更新

是的,代码无法传递VC8.0错误C2664:'std :: auto_ptr <_Ty> :: auto_ptr(std :: auto_ptr <_Ty>&)throw()':无法将参数1从'Fred*'转换为' std :: auto_ptr <_Ty>&'

代码是从C++ FAQ 12.15中复制的.

但是,在进行以下更改后,

replace 
  return new Fred(i);
with
  return auto_ptr<Fred>(new Fred(i));
Run Code Online (Sandbox Code Playgroud)

这段代码可以通过VC8.0编译器.但我不确定这是否是正确的解决办法.

Jam*_*lis 6

std::auto_ptr确实有一个构造函数,它将一个原始指针作为其参数,但该构造函数是explicit并且不能用作转换构造函数.

此代码将无法编译.

  • 考虑到`auto_ptr`的所有权语义,隐式转换为`auto_ptr`会非常疯狂 (3认同)