2013-02-12 58 views
4

在一個對象中,我有一個const-句柄數組給另一個特定類的一些對象。在一種方法中,我可能想要返回這個句柄之一作爲inout-參數。這裏作爲一個簡化的例子:inout參數 - 用另一個替換一個常量句柄

class A {} 

class B { 
    const(A) a[]; 
    this() { 
     a = [new A(), new A(), new A()]; 
    } 

    void assign_const(const(A)* value) const { 
     // *value = a[0]; // fails with: Error: cannot modify const expression *value 
    } 
} 
void main() { 
    const(A) a; 
    B b = new B(); 
    b.assign_const(&a); 
    assert(a == b.a[0]); // fails .. obviously 
} 

我不想刪除原始數組中的常量。類B是指收集常數A -items的某種視圖。我是來自C++的新手。 D-way中的const正確性是否已經搞亂了?我已經嘗試了幾種方法來使這個工作,但沒有線索如何得到它的權利。

在沒有「邪惡」鑄造的情況下執行此查找的正確方法如何?

回答

5

丟掉const並修改元素在D中是未定義的行爲。不要這樣做。一旦出現const,它就是const。如果數組的元素是const,那麼它不能被更改。因此,如果您有const(A)[],那麼您可以將元素追加到數組中(因爲它的元素是const,而不是數組本身),但不能更改數組中的任何元素。這與immutable一樣。例如,stringimmutable(char)[]的別名,這就是爲什麼您可以附加到string,但不能更改其任何元素。

如果您想要一個const對象的數組,您可以在其中更改數組中的元素,則需要另一個間接級別。在結構的情況下,你可以使用指針:

const(S)*[] arr; 

但不會帶班工作,因爲如果C是一類,然後C*點,一類對象的引用,不是對象本身。對於課程,您需要做

Rebindable!(const C) arr; 

Rebindable在std.typecons中。

+0

拋棄const是我最後的選擇,即使它是定義的行爲。在此之前,我已經完全刪除了常量。但是,在我找到一個可接受的解決方案之前,它已經過時了,可以使用Rebindable(..或者至少幾天)。謝謝! – 2013-02-13 19:05:26

+1

如果你閱讀一篇提及它的文章或對這樣的問題的回答,那麼你可能只會瞭解這類事情。但是由於D的類型系統的工作原理,你幾乎不得不像''Rebindable''那樣做一個'const'類,但是它的引用不是'const' - 類型系統根本沒有任何差別的概念兩者之間。 'Rebindable'很好地解決了這個問題,但是由於大多數人都很難理解爲什麼他們不能用語言本身來做,所以大多數人都會想到這種事情。 – 2013-02-13 23:45:14