difficulties with const structs and alias this / template functions

Stanislav Blinov stanislav.blinov at gmail.com
Mon Nov 19 02:39:32 UTC 2018


On Monday, 19 November 2018 at 02:08:14 UTC, Dennis wrote:
> On Monday, 19 November 2018 at 01:24:02 UTC, Stanislav Blinov 
> wrote:
>> Yup, that's because, like Rubn said, copying value types is 
>> trivial. Where it all comes to bite you is when you start 
>> having pointers, because you can't copy a const(T)* into a T*.
>
> I'm not using reference types, but still:
>
> ```
> struct S {
>     int a;
>     this(int a) {
>         this.a = a;
>     }
> }
>
> void main()
> {
>     immutable S d = 3;
> }
>
> ```
>
> onlineapp.d(10): Error: mutable method onlineapp.S.this is not 
> callable using a immutable object
> onlineapp.d(10):        Consider adding const or inout to 
> onlineapp.S.this
>
> const still leaves the first error...

You're skimming the examples ;)

struct S {
     int a;
     this(int a) { this.a = a; }
     this(int a) const { this.a = a; }
     this(int a) immutable { this.a = a; }
}

or

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

> ...inout works though I don't know what it does.

Recall that member functions (including constructors) are just 
functions in disguise:

struct S {
     this(int a) inout { /* ... */ }
}

what that boils down to, conceptually, is:

void _compiler_made_it_a_struct_S_constructor(ref inout S this, 
int a);

In other words, an `inout` method makes the "this" reference an 
`inout`. Same goes for const, immutable, etc.


More information about the Digitalmars-d-learn mailing list