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; 
} 

嗯哦,你已经创建了一个可变引用不可变的数据,打破了类型系统。

相关问题