2016-04-27 61 views
6

建議N4282提倡一種新型的非擁有智能指針,稱爲observer_ptr。它的工作名稱是exempt_ptr,它的目的是替代「原始指針」。但我不明白它的目的,特別是對於這個假設的代碼是什麼它的設計來實現:「世界上最笨的智能指針」有什麼意義?

struct do_nothing 
{ 
    template <class T> 
    void operator()(T*) { }; // do nothing 
}; 

template <class T> 
    using non_owning_ptr = unique_ptr<T, do_nothing>; 

即使看完文章後,我不明白,一個智能指針是不會做的目的沒有。它對非擁有shared_ptr或原始指針有什麼優勢?

+3

它可以幫助您通過靜態分析編寫正確的代碼。例如,如果你錯誤地在其中的一個上調用了「delete」,編譯器會給你一個錯誤,從而阻止你釋放你不擁有的內存。 –

回答

8

您是否閱讀過鏈接proposal N4282的「動機」部分?

對於程序員來說,檢查代碼以識別任何特定裸指針的使用是非常具有挑戰性和耗時的,即使這種使用根本沒有管理角色。正如LoïcA. Joly觀察到的那樣,「消除僅僅觀察數據的T *指針是不容易的......即使它僅僅用於文檔,擁有專用的類型也會有一些價值,我認爲。」我們經驗使我們同意這種評估。

換句話說,它是使代碼更自我記錄。

例如,如果我看到了以下功能:

void do_something(Foo *foo); 

然後我不知道do_something正在FOO的所有權,欲不定長度的一個Foo陣列,只需要一個可空參考吧,將其用作Google C++ Style Guide風格的輸出參數,或者是僅僅需要引用的傳統C風格的代碼。

但是,如果我看到

void do_something(observer_ptr<Foo> foo); 

然後我知道這是觀察的Foo實例,並沒有更多的。

C++ Core Guidelines有幾個使用模板的附加示例(owner,not_null等),不是爲了添加運行時功能,而是爲了更好地記錄行爲。

+0

observer_ptr是否阻止寫入包裝的ptr?此外,您在答案中提出的激勵問題可以通過Foo const * ptr來解決。 observer_ptr提供的const ptr沒有提供什麼?只是對你的這個感興趣。 – denniskb

+0

@denniskb - 不是'observer_ptr'可以做任何'Foo const * ptr'不能做的事情。 (這就是爲什麼它被稱爲「世界上最愚蠢的智能指針」。)這是因爲'observer_ptr'可以與其他開發人員(以及潛在的靜態分析工具)通信,以便如何使用指針。 –

+0

thx的澄清。儘管我強烈反對這一說法。 const是爲此做出的,它是您可以在C++程序中提供的最強保證之一。我認爲,當開發人員在幾十年的時間裏實踐const正確性時,我不認爲增加新的冗餘語法和較弱的語義的好處。 – denniskb