3
void increment(ref int i) 
{ 
    ++i; 
} 

class Class 
{ 
    immutable int member; 

    this(int parameter) 
    { 
     member = parameter; 
     ++member;   // okay 
     increment(member); // compile-time error 
    } 
} 

爲什麼++member沒問題,但increment(member)不是?不應該都以相同的方式?更改構造函數內的不可變成員

+0

但是這會讓事情變得簡單。 :P – Mehrdad 2012-08-08 08:34:10

+0

有趣的是這個工作:'void increment(int i,out int j){j = i + 1; }',並用'increment(member,member)'調用它。 – Arlen 2012-08-08 15:04:27

回答

5

大概是因爲參考incrementscope,所以它有可能進行轉義過去的構造,這將打破member不變性的範圍,而編譯器無法確認它的罰款。

(這可能是scope不會工作,但它應該。如果實施得當,我想scope會解決類似這些錯誤的很多,以及提供有趣的優化。如果不,我會說這是一個錯誤。)

我已經指出了以前的類似的錯誤,但與代表。
CONST /不可變確實有D.

+1

範圍工程 - 我剛剛檢查。 – 2012-08-09 00:32:48

0

這樣的問題我猜測

this(int parameter) { 
    member = parameter; 
    ++member; 
} 

Class(int parameter): member(parameter+1) {} 

C中的等效++。

我認爲member字段在構造函數中並不是真正可變的,所以編譯器可以優化它來初始化它。但它不能通過調用另一個函數來完成。

PS。它適用於ideone:http://ideone.com/5ym5u

+0

http://dpaste.dzfl.pl/3792e6ef - 不適用於DMD 2.060 – DejanLekic 2012-08-10 18:09:35

+0

Ideone有一個較舊的版本 - 2.042。所以我想我會和彼得亞歷山大的回答一起去。 – 2012-08-11 10:40:00

3

如果increment是什麼?

int* p; 
void increment(ref int i) 
{ 
    p = &i; 
} 

嗯哦,你已經創建了一個可變引用不可變的數據,打破了類型系統。

相關問題