Why does this not compile?

Simen Kjærås simen.kjaras at gmail.com
Tue Mar 6 15:00:07 UTC 2018


On Tuesday, 6 March 2018 at 13:56:30 UTC, Steven Schveighoffer 
wrote:
> On 3/6/18 8:42 AM, Simen Kjærås wrote:
>> unittest {
>>      int i = 0;
>>      struct S {
>>          int n;
>>          void fun() const {
>>              i++;
>>          }
>>      }
>>      const S s;
>>      assert(i == 0);
>>      s.fun();
>>      assert(i == 1);
>> }
>
> That, I would consider a bug. If it's not, then definitely, you 
> should be able to implicitly cast to/from const.
>
> So a bug report is in order. It should be decided one way or 
> another -- either the context pointer is part of the struct 
> type or it isn't.

immutable throws a wrench in the works for the idea that the 
context pointer is part of the struct. Consider the exact same 
example, but with immutable(S) instead of const(S). IMO, this 
indicates the context is not part of the struct (though the 
context *pointer* arguably is).

And just in case anyone doesn't immediately see how even 
disallowing the above would not solve the immutable problem:

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

Interestingly, replacing 'const' with 'immutable' on fun gives a 
compilation error: "immutable function 
'foo.__unittest_foo_1_0.S.fun' cannot access mutable data 'n'".

This seems even weirder to me, but can certainly be taken as 
evidence in favor of your view. The same error message does *not* 
show up if n is instead a global variable.

--
   Simen


More information about the Digitalmars-d mailing list