我有一些使用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集的完全兼容的智能指针,我可以在这里使用吗?
答案 0 :(得分:9)
unique_ptr
是auto_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
进行编译。