2013-05-27 84 views
6

來自http://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/爲什麼使用make_unique調用來初始化unique_ptr?

我們爲什麼要這樣寫:而不是

auto pb = unique_ptr<base>{ make_unique<derived>() }; 

剛:

auto pb = make_unique<derived>(); 

我唯一的猜測是,如果我們想auto,我們需要幫助它推導出正確的類型(這裏爲base)。

如果是這樣,那麼這對我來說將是非常值得懷疑的優點..鍵入auto,然後對=右側型式很多初始化..

我缺少什麼?

+1

呃,爲什麼?因爲你想要第一件事而不是第二件事?它們並不等同。 (檢查'decltype(pb)') –

+1

這裏有一點很清楚,如果你有一個派生的smart_pointer,你不能輕易地將它轉換爲base。因爲不像base * x;並派生* y; 在類型層次結構中沒有關係。 – Alex

+4

只是想知道,會'unique_ptr pb = make_unique ();'更簡單嗎?因爲'auto'的存在並不意味着我們必須使用它。 – FredericS

回答

10

那麼,重點是第一個選項使得pb a unique_ptr<base>,而第二個選項使得pb a unique_ptr<derived>。在你的情況下,兩者是否正確取決於你需要做什麼pb - 但絕對兩者不是等價的。

如果你的程序的相關部分需要與unique_ptr<base>工作(也許是因爲以後你要讓它指向一個不同派生類的實例),那麼第二個解決方案是根本不可行。

例如:

auto pb = unique_ptr<base>{ make_unique<derived>() }; 
// ... 
pb = make_unique<derived2>(); // This is OK 
// ... 

鑑於:

auto pb = make_unique<derived>(); 
// ... 
pb = make_unique<derived2>(); // ERROR! "derived2" does not derive from "derived" 
// ... 
+3

Ew,raw'new'! – Xeo

+2

真正的男人使那些獨特。 –

+1

@Xeo:'new'?誰在使用'new'? :P編輯,謝謝 –

3
auto pb = unique_ptr<base>{ make_unique<derived>() }; 

上述創建unique_ptr<base>包含derived

auto pb = make_unique<derived>(); 

上述創建unique_ptr<derived>包含derived

雖然用1st替換2nd可能是可以接受的,但他們實際上做了不同的事情。

另外,在鏈接文章中搜索make_unique會導致某人在那裏回答這個問題。

6

我唯一的猜測是,如果我們想要汽車,我們需要幫助它推斷出正確的類型(基地在這裏)。

完全正確。如果沒有轉換,pb將成爲derived的指針,這可能不是您想要的。例如,您不能重新分配它以擁有base或其他派生類對象。

如果是這樣,那麼對我來說這將是真正值得懷疑的優點..

我傾向於同意。作者在comment中指出,他這樣做是因爲他喜歡儘可能使用類型推導,並在必要時進行明確的轉換。時間會告訴你這種風格是否會變得司空見慣。

+0

+1鏈接到草本的評論(和你的好回答太:) – emesx

相關問題