2013-07-12 73 views
1

我有一個使用std::auto_ptr並給出了(在SUSE Linux 12.2 GCC 4.7.1)有關不推薦std::auto_ptr醜陋的警告,編譯時的一些代碼。什麼是C++ 11標準的等價物不推薦使用std :: auto_ptr?

所以我曾嘗試以下(因爲我發現,指出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 
}; 

AutoPtr<T>::Type更換,std::auto_ptr<T>任何引用,但有使用此選項時編譯錯誤。

我很確定我想在這些代碼片段上使用類似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套,我可以在這裏使用?

+2

包裝類是有點毫無意義。你可以說'#define AutoPtr std :: auto_ptr'等,然後說'AutoPtr '。 –

+1

什麼是編譯錯誤? –

+1

它應該是'可變AutoPtr ::類型embeddedMock;' –

回答

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_ptrmove加入編譯。

+0

但是'mutable'聲明的目的是什麼。我很快就看到了一位聲譽良好的SO成員的答案,它顯示瞭如何顯式地使用「std :: unique_ptr」的所有權,這將符合'std :: auto_ptr'。引入移動語義(適用於C++ old和cx11標準的編譯好的代碼)在這裏幫助不大: –

+1

@ g-makulik,對,錯過了'mutable'部分。對不起。 )如果你想在C++ 11和C++ 98下編譯代碼,你總是可以引入一個虛擬的'move'類型的操作,它可以在C++ 98下編譯出來,例如:'' #ifdef CPP11 | | #define MOVE(X):: std :: move(X)'|'#else' |'#define MOVE(X)X' |'#endif' –

相關問題