How to break const

Era Scarecrow rtcvb32 at yahoo.com
Mon Jun 18 13:57:22 PDT 2012


On Monday, 18 June 2012 at 15:24:31 UTC, Mehrdad wrote:
> On Monday, 18 June 2012 at 15:21:36 UTC, Timon Gehr wrote:
>>> So (**IMHO**) if that's really the case, we should really 
>>> spend some time fixing the /design/ of const before the 
>>> implementation...
>>
>> This is mostly about the design of object initialisation.
>>
>>> good idea or no?
>>
>> Certainly.
>
>
> My initial instinct would be to require a "const constructor" 
> in order for an object to be const-able, but I'm not sure if 
> that would work correctly or not..

  Hmmm... Reminds me of an issue that ended up coming up regarding 
code I was transforming to use immutable rather than mutable 
data. I kept coming up with the same issues. Without a const 
specific constructor, the immutable data I was basing the 
information off refused to go to a mutable temporary (since I 
needed it to be mutable), even if the end object was immutable 
and the data was untouched.

  I ended up with having to make a separate function that acted as 
a constructor, copying immutable elements and data as needed as 
mutable, then passing it back as immutable afterwards. A little 
ugly but it got the job done.

  I also came across an interesting problem.

struct X {
     immutable int i_i = 10;
     const int c_i = 10;   //same with immutable

     immutable int i_i2;
     const int c_i2;

     this (int n) {
         i_i = n; //ct error
         c_i = n; //ct error

         i_i2 = n;
         c_i2 = n;
     }
}

void main(){
     X x = X(15);
}

  In this case it refuses to modify i_i & c_i during the 
constructor, the value of i_i & c_i specify is basically a 
replacement default(init) and should remain mutable until the 
constructor is finished (Or at least allowed to set once). If I 
wanted a strictly unchanged value I probably would have used an 
enum, and not used the space.

  Is this a bug or intentional?


More information about the Digitalmars-d mailing list