嗯...我敢肯定這是不是爲將來std::make_unique
的一個變通的實施給予,但無論如何,函數功能是很容易理解的,但它需要你具有新的C++ 11功能的先驗知識。
template <typename TT, typename A>
unique_ptr<TT> make_unique(int i, A && a)
{
return unique_ptr<TT>{new TT{ i, std::forward<A>(a) }};
}
所有make_unique
首先是函數模板,我真的希望你已經知道了,如下面將需要您有至少最基本的知識是什麼模板功能以及如何使用模板工作。
現在到非平凡的部分。 A && a
有一個函數參數。具體而言,a
是類型爲A&&
的函數參數,其爲r-value reference。由於它的類型是模板類型參數,我們可以從調用者作爲參數傳遞給a
的任何參數推導出它的類型。每當我們有r值參考和參數類型扣除,特殊扣除規則和參考摺疊踢腿,我們有一個所謂的「通用參考」這是完美的轉發功能特別有用。當我們有一個通用的參考文獻(在我們的例子中爲a
)時,我們幾乎總是希望每當我們想要使用它們時都保留其原始的「l值」或「r值」。要有這種行爲,我們幾乎總是應該使用std::forward
(std::forward<A>(a)
)。通過使用std::forward
,最初作爲l值傳遞的變量保持爲l值,並且最初作爲r值傳遞的變量仍然是r值。
在那之後,事情只是簡單的
return unique_ptr<TT>{new TT{ i, std::forward<A>(a) }};
注意使用括號。它使用C++ 11的uniform initialization調用構造函數的語法來代替使用括號。通過new TT{ i, std::forward<A>(a) }
,您可以動態分配帶有大括號內給定參數的TT
類型的對象。使用unique_ptr<TT>{new TT{ i, std::forward<A>(a) }};
,您將創建一個unique_ptr<TT>
,其參數是動態分配返回的參數。現在,該函數返回unique_ptr<TT>
對象。