On Thursday, 23 May 2013 at 15:41:32 UTC, Steven Schveighoffer wrote:
An interesting subject is being debated by some of the heavy hitters of D on the latest beta on the announce NG.

However, I have found that there is an inconsistency in TDPL that needs to be addressed.

Forgetting the controversy currently brewing, we have the following current situation:

struct S
{
   immutable int x;
   this(int n)
   {
      x = n;
      int y = x;
      x = 0;
   }
}

This compiles, and shows that one can use an immutable, and then the immutable can be changed. This is no good, for obvious reasons.

I think immutable is something you cannot change. Also, the reverse is true, if you can change something, it's not immutable. According to this logic, x is not immutable inside the scope of the constructor, because you *can* change it. Therefore it should be so that:

import std.traits;

struct S
{
    immutable int x;

    this(int n)
    {
        static assert(isMutable!(typeof(x)));
    }
}
static assert(!isMutable!(typeof(S.init.x)));

Reply via email to