Why does this not compile?

Timon Gehr timon.gehr at gmx.ch
Tue Mar 6 22:27:34 UTC 2018


On 06.03.2018 17:19, Steven Schveighoffer wrote:
>>
>> unittest {
>>      int n = 0;
>>      struct S {
>>          int fun() const { return n; }
>>      }
>>      immutable S s;
>>      assert(s.fun == 0);
>>      n++;
>>      assert(s.fun == 1); // Not so immutable now, are you?
>> }
> 
> That's not a demonstration of breaking immutability. counter-proof:
> 
> struct S
> {
>     static int x;
>     int fun() const { return x; }
> }
> 
> immutable S s;
> assert(s.fun == 0);
> S.x++;
> assert(s.fun == 1);
> 
> In other words, if the struct can access the data considered "outside 
> it's instance", then it it can return it, change it even.

Here's how to break immutability:

void main(){
     int i = 0;
     struct S{
         const(int)* fun()const pure{
	    return &i;
         }
     }
     immutable S s;
     static const(int)* foo(immutable(S) s)pure{
	    return s.fun();
     }
     immutable(int) *pi=foo(s);
     import std.stdio;
     writeln(*pi); // 0
     i+=1;
     writeln(*pi); // 1
}

The reasoning "the reference is stored in the type yet not part of the 
type" does not work for pure functions, as then you cannot offer an 
alternative explanation in terms of an external data store.

https://issues.dlang.org/show_bug.cgi?id=18567


More information about the Digitalmars-d mailing list