我正在閱讀Effective C++ 3rd Edition。在70頁上,作者說:是否將unique_ptr隱式轉換爲支持的原始指針?
Like virtually all smart pointer classes,
tr1::shared_ptr
andauto_ptr
also overload the pointer dereferencing operators (operator->
andoperator*
), and this allows implicit conversion to the underlying raw pointers (...)
然後,他顯示了shared_ptr
一個例子基於一個名爲Investment
類特色隱式轉換(這是當時的tr1
部分):
shared_ptr<Investment> pi1();
bool taxable1 = !(pi1->isTaxFree());
^implicit conversion
shared_ptr<Investment> pi2();
bool taxable2 = !((*pi2).isTaxFree());
^implicit conversion
好,我從那以後用unique_ptr
寫了幾個測試用例,他們堅持下來。
我還發現約unique_ptr
supporting arrays和shared_ptr
is also going to(見注)。但是,在我的測試中,隱式轉換似乎不適用於數組周圍的智能指針。
例子:我想這是有效的...
unique_ptr<int[]> test(new int[1]);
(*test)[0] = 5;
但它不是,根據我的編譯器(的Visual C++ 2015年更新3)。
然後通過搜索,我發現一些證據表明隱式轉換根本不被支持......比如這個例子:https://herbsutter.com/2012/06/21/reader-qa-why-dont-modern-smart-pointers-implicitly-convert-to。
在這一點上,我有疑問。 是否支持(按標準),還是不是?
注:這本書可能是在這個題目有點過時,因爲筆者也第65頁說:「有沒有像auto_ptr
或tr1::shared_ptr
爲dinamically分配的數組,甚至在TR1」。
'*測試[0] = 5;'你的尊重'unique_ptr :: operator []'的結果。當然,它不適用於普通的'int'。 – StoryTeller
@StoryTeller夠公平的。我有固定的,我想...... –
'的unique_ptr'沒有'的operator *()'。 '的unique_ptr 'has'operator *()','同時的unique_ptr ''具有操作符[]()'代替。這樣設定的值,簡單地使用:'測試[0] = 5;' –