2017-02-09 97 views
2

從我讀的the std::shared_ptr doc中,不能使用=從現有指針初始化shared_ptrstd :: shared_ptr - 我可以使用等號(=)進行初始化嗎?

如果您希望從現有的指針進行初始化,唯一可用的語法是
std::shared_ptr<int> p3 (new int);

問題

它是正確的,你不能使用=初始化shared_ptr如下所示:

std::shared_ptr<Foo> pFoo = new Foo(bar); 

其他人(在C++方面比我有更多的經驗)has stated,你可以。

+3

他是錯的, [構造函數](http://en.cppreference.com/w/cpp/ memory/shared_ptr/shared_ptr)被標記爲'explicit' – WhiZTiM

+0

從'Foo *'的隱式轉換是無效的。但這是好的:'std :: shared_ptr pFoo = std :: shared_ptr (new Foo(bar));' – juanchopanza

+0

@juanchopanza是的,我同意。我更關注[他的聲明](http://stackoverflow.com/a/42142680/4784683),使用'='是***初始化*** vs ***分配*** – Adrian

回答

6

您不能初始化std::shared_ptr,因爲單個參數constructor標記爲explicit

但是,您可以初始化它使用任何的:

std::shared_ptr<Foo> pFoo(new Foo(bar));       //direct-initialization 
std::shared_ptr<Foo> pFoo{new Foo(bar)};       //direct-list-initialization 

或者:

std::shared_ptr<Foo> pFoo = std::shared_ptr<Foo>(new Foo(bar)); //copy-initialization 
std::shared_ptr<Foo> pFoo = std::shared_ptr<Foo>{new Foo(bar)}; //copy-initialization 

更妙的是使用std::make_shared<Foo>通常確實a single allocation

auto pFoo = std::make_shared<Foo>(bar);      
+1

或者std :: shared_ptr pFoo {new Foo(bar)};'。 –

1

因爲構造函數被標記明確不能使用語法如

std::shared_ptr<int> p3 = new int; 

初始化std::shared_ptr [source]

template <class Y> 
explicit shared_ptr(Y* ptr); 

並以這種形式初始化涉及轉換權手邊到shared_ptr<int>,隱式轉換不允許調用顯式構造函數。

1

你是對的:語法是非法的。鏈接到的文檔中的第三個構造函數標記爲explicit,這意味着符合要求的編譯器和標準庫實現將不允許使用之類的內容。

使用正確符合的編譯器/庫,有可能有問題的用戶是而不是,或者可能用於沒有此限制的手動捲起的shared_pointer對象。

相關問題