簡體   English   中英

為什么要使用make_unique調用初始化unique_ptr?

[英]Why initialize unique_ptr with a make_unique call?

取自: http//herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/

我們為什么要寫:

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

而不僅僅是:

auto pb = make_unique<derived>();

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

如果是這樣,那么對我來說,這將是非常值得懷疑的...鍵入auto然后在=的右側鍵入大量初始化。

我錯過了什么?

好吧,重點是第一個選項使pb成為unique_ptr<base> ,而第二個選項使pb成為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"
// ...

我唯一的猜測是,如果我們想要自動,我們需要幫助它推斷出正確的類型(這里是基礎)。

這是完全正確的。 沒有轉換, pb將是一個指向derived的指針,可能不是你想要的。 例如,您無法將其重新分配給擁有base或其他派生類對象。

如果是這樣,那么對我來說這將是值得懷疑的功績。

我傾向於同意。 作者在評論中注意到他這樣做是因為他喜歡盡可能多地使用類型推導,並在必要時進行明確的轉換。 時間將證明這種風格是否變得司空見慣。

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

上面創建了一個包含derivedunique_ptr<base>

auto pb = make_unique<derived>();

上面創建了一個包含derivedunique_ptr<derived>

雖然用第一個替換第二個是可以接受的,但它們實際上做了不同的事情。

make_unique ,在鏈接文章中搜索make_unique導致有人在那里回答這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM