2017-06-29 65 views
0

考慮下面的代碼時「DUP不能推導函數」:d - 「內常量」屬性時使用的

class Bar 
{ 
} 
class Foo 
{ 
    private: 
     Bar[] bars_; 
    public: 
     Bar[] bars() const @property { return bars_.dup; } 
} 
void 
main() 
{ 
    auto f = new Foo(); 
} 

的目的是爲具有Bar秒的只讀陣列。但是這不能編譯。編譯失敗

模板object.dup不能推斷功能

如果const預選賽中被刪除,它編譯罰款,但我真的想保持它 - 它不屬於那裏。我試過用bars_.dup!Bar來代替,但是這沒什麼變化。我顯然做錯了事情--DMD,LDC和GDC都顯示相同的行爲 - 但我無法弄清楚什麼。

回答

1

你必須在那裏做一些深層複製。對於const類,這意味着_bars也是const ...這意味着Bar也是const。它一直是const的。

dup函數只做一個淺拷貝。它將數組複製到裏面的對象的新引用,但不會複製對象本身。所以dup,雖然新鮮的可變數組仍然指向相同的const對象,所以它不會讓你把它轉換爲Bar[],只有const(Bar)[]

意圖是有一個只讀的酒吧數組。

以下是我會做:

const(Bar[]) bars() const @property { return bars_; } 

而不重複,它只是返回現有的參考,但將其標記常量的返回值。

帶parens的第一個const包含返回值,下一個const涵蓋this參考。你們倆都應該得到你想要的。