加
抛
為函數屬性
理由
目前,預設情況下允許函數引發異常.可以通過應用
不抛
屬性來更改此行為.但一旦
不抛
在
子產品域或塊
中使用,其域中的所有函數都會受到影響;
是以聚合
不繼承
從外部域的
不抛
屬性.如需要整個子產品
不抛
,那麼該屬性不僅必須在子產品域内應用,而且必須在每個聚合的定義内應用:
空 欄(); //可抛
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#
)具有安全性,可
選出
而不是
選進
.