什么是c ++ 11标准相当于已弃用的std :: auto_ptr?

时间:2013-07-12 21:18:11

标签: c++ c++11

我有一些使用std::auto_ptr的代码,并在编译时给出了关于弃用std::auto_ptr(Suse Linux 12.2上的GCC 4.7.1)的丑陋警告。

所以我尝试了以下内容(因为我发现某些来源,std::unique_ptr应该是相应的等价物)

template<typename T>
struct AutoPtr
{
#ifdef COMPILE_FOR_CX11
    typedef std::unique_ptr<T> Type;
#else
    typedef std::auto_ptr<T> Type;
#endif
};

并将std::auto_ptr<T>的任何引用替换为AutoPtr<T>::Type,但在使用此选项时出现编译错误。

我很确定我想在这些代码中使用类似std::auto_ptr之类的东西,而且我知道它的罪魁祸首和缺陷。在使用std::unique_ptr时,我得到的错误似乎与构造问题有关。

作为旁注:用于构造的最后一个类是继承类型T,代码如下:

class MockClass;

class Client
{
public:
    Client();
    Client(const Client& rhs);

private:
    mutable AutoPtr<MockClass>::Type embeddedMock;
};

Client::Client()
: embeddedMock(new ::testing::NiceMock<MockClass>())
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Getting errors here!
{
}


Client::Client(const Client& rhs)
: embeddedMock(rhs.embeddedMock)
{
}

那么什么是来自c ++ 11集的完全兼容的智能指针,我可以在这里使用吗?

1 个答案:

答案 0 :(得分:9)

unique_ptrauto_ptr的C ++ 11替换工具。但是,它不是替代品,因为auto_ptr具有复制所有权转移语义,unique_ptr强制您明确转移所有权。当你有这样的事情时:

auto_ptr<Foo> x(new Foo());
// ...
auto_ptr<Foo> y = x;
// ...
bar( y ); // copies y into bar(), transferring ownership

。 。 。要使用unique_ptr,您需要将move()添加到所有权转移网站:

unique_ptr<Foo> x(new Foo());
// ...
unique_ptr<Foo> y = move(x);
// ...
bar( move(y) );

修改

在不知道您遇到的具体错误的情况下,很难说明为什么默认构造函数无法编译。但是,除非添加unique_ptr,否则复制构造函数将无法使用move进行编译。