difficulties with const structs and alias this / template functions

Dennis dkorpel at gmail.com
Mon Nov 19 14:04:29 UTC 2018


On Monday, 19 November 2018 at 13:34:50 UTC, Stanislav Blinov 
wrote:
> Because it's not mutation, it's initialization.

Ohhhhh. That's an epiphany for me.

> When a ctor is `pure`, the compiler knows it doesn't mutate any 
> state other than the object's, so it allows conversion to all 
> three qualifiers.

I had trouble thinking of an example where impure constructors 
would break immutable, but now I get it:

```
int* gPtr;

struct S {
   int a;
   this(int a) {
     this.a = a;
     gPtr = &this.a;
   }
}

void main() {
   S s = 1;
   (*gPtr)++;
}
```
s can't be immutable because its field could be mutated, so the 
constructor needs to be pure (so gPtr can't be set) or immutable 
(so &this.a is an immutable(int)*).

> What you can do, however, if you don't have an const/immutable 
> constructor, is call a mutable constructor explicitly, so long 
> as conversion is possible (i.e. value types)

Interesting.




More information about the Digitalmars-d-learn mailing list