void main() {
    struct S {
        uint value;

        ~this() {

    const S a = S(12);
    S b = a;

test.d(10): Error: cannot implicitly convert expression a of type const(S) to S

Doing *any* of the following makes the code compile:
* Making the struct "static"
* Making the struct global (essentially same as above)
* Removing the struct's destructor

I can kinda see why it won't compile without making it static. There is a hidden pointer to the frame that is const, implying the frame is also const. This constness would be overridden if the assignment is allowed to go through. I don't think this is a very good reason (see below), but I understand it.

What I do not understand is why removing the destructor solves the error.

While I get while the compiler treats the frame pointer as const, I should point out that if I add a static variable to the struct, that one remains mutable even when the instance itself is const. There is no inherent difference between a variable stored as static and a variable stored in the context frame.

And before you answer with "in D pointer constness is transitive", allow me to point something out: It is not possible to ever change the frame pointer of a struct. That pointer is, effectively, always const.


Reply via email to