天天看點

d語言的改進:預設不抛與安全

為函數屬性

理由

目前,預設情況下允許函數引發異常.可以通過應用

不抛

屬性來更改此行為.但一旦

不抛

子產品域或塊

中使用,其域中的所有函數都會受到影響;

是以聚合

不繼承

從外部域的

不抛

屬性.如需要整個子產品

不抛

,那麼該屬性不僅必須在子產品域内應用,而且必須在每個聚合的定義内應用:

空 欄(); //可抛
struct  S1 {
     不抛 void foo(){bar();}//錯誤,bar()抛
}

不抛{
     struct S2{
         void foo(){bar();}//正确,因為未應用`不抛`
    }
}
           

問題是,即使在永

不抛

的代碼中,異常成本很高.是以,異常應該是

選進

,而不是

選出

.盡管此DIP不建議

啟用異常

,但

屬性是其關鍵要求.該屬性對文檔也有幫助,是的,函數确實

可抛

.

先前工作

@安全,@信任和@系統

屬性可互相覆寫.

描述

到屬性.加

函數屬性

.這與

抛語句

的開頭有歧義, 但可向前看是否

後有個

聲明

來消歧.

該屬性僅适用于

函數和閉包

類型,忽略其他類型.如在函數聲明中出現,則表明該函數

可抛

出異常.

空 bar()抛 ;

struct S1 {
     不抛 void foo(){bar();}//錯誤,bar()抛
}

struct S2 {
     void foo(){bar();} //正确 
}
           

不能同時

不抛

,但可在

閉域

内互相覆寫:

空 abc()抛 抛 ;   //錯誤
void  bar()抛 不抛 ; //錯誤

不抛:
    foo()抛 ; //好

抛:
    def()不抛 ; //好
           

文法變化

函數屬性

:

函數屬性:

  • 不抛

    屬性

重大變更和棄用

參考

Herb Sutter在"去碎片化的C++"的

使異常更便宜且有用

中說:“一半以上C++使用者在C++代碼中全部或部分禁止了異常”.

@安全

設為預設值

目前,D函數預設為@系統.本DIP建議将預設值改為

@安全

.

理由

最初開發D時,幾乎不額外檢查安全@安全.但,随着不安全代碼的成本

越來越明顯和昂貴

,且

@安全函數

越來越強大,平衡已發生了變化.使用者期望預設

安全

,而不是相反.

先前工作

其他語言(如

Rust和C#

)具有安全性,可

選出

而不是

選進

.

描述

重大變更和棄用