2012-09-19 47 views
0

我是D的新手,所以我可能會弄錯一些東西,請賜教!爲什麼D中沒有`isIn`特徵?

據我瞭解從documentation d提供性狀發現關於函數參數的裝飾品:

void fooref(ref int x) { 
    static assert(__traits(isRef, x)); 
    static assert(!__traits(isOut, x)); 
    static assert(!__traits(isLazy, x)); 
} 
void fooout(out int x) { 
    static assert(!__traits(isRef, x)); 
    static assert(__traits(isOut, x)); 
    static assert(!__traits(isLazy, x)); 
} 
void foolazy(lazy int x) { 
    static assert(!__traits(isRef, x)); 
    static assert(!__traits(isOut, x)); 
    static assert(__traits(isLazy, x)); 
} 

爲什麼沒有尋找出關於in裝飾一特質?

+0

可能是因爲默認? – DejanLekic

+0

mmmhhh ......這是否意味着'in'有點多餘?在'void foo(intx)'和'void foo(int x)'完全等價的意義上? – steffen

+4

它不是默認值,並且與作用域常量相同。 –

回答

3

__traits and std.traits有很多好東西在裏面,但它們不一定完整。因此,如果您發現某些您認爲應該使用__traitsstd.traits進行檢查的內容,請致電create an enhancement request

現在,這就是說,這是沒有什麼意義的,有沒有辦法檢查ininconst scope相同,如果您可能檢查in,那麼const scope也必須與其匹配。真的,你關心const還是你關心scope?或者你關心兩者?檢查這些,而不是in

但是,不幸的是,目前,當使用in時,它實際上並沒有檢查scopestd.traits.ParameterStorageClassTuple可用於獲取參數(無,scope,out,ref,ref和/或lazy)的存儲級別,但它當前未能針對in給出scope。所以,目前,你運氣不好。有報道稱bug

但你仍然可以通過執行類似is(T == const)(其中T是,你正在檢查的參數的類型)檢查const

+0

我不知道'std.traits'。除了'__traits'外還有其他理由嗎? – steffen

+0

'__traits'是編譯器給你的。 'std.traits'是建立在庫之上的額外東西。總的來說,我相信只有在'__traits_'中才能存在,而不是能夠在庫中完成,但std.traits更新,因此可能不完全正確。有些人建議他們以某種方式合併,但目前沒有任何跡象表明這種情況會發生。此時,您只需使用提供您需要的任何一個。 –

相關問題