Article: Why Const Sucks

Nemanja Boric 4burgos at gmail.com
Tue Mar 6 11:03:24 UTC 2018


On Tuesday, 6 March 2018 at 10:49:48 UTC, Dukc wrote:
> On Monday, 5 March 2018 at 10:57:35 UTC, Jonathan M Davis wrote 
> (in the article):
>> The problem is that the entire object must be fully 
>> initialized before
>> the body of the postblit constructor is run. That means that 
>> any member
>> variables which are const or immutable are stuck at whatever 
>> they were in
>> the original object, because it would violate the type system 
>> to mutate them. And if an object is const or immutable, then 
>> that's all of the members.
>
> I think we have a misunderstanding here. According to that, 
> this would not compile (imports left out):
>
> struct placeAtWorldMap
> {   char[] title;
>     int[2] coordsMicroDeg;
>
>     this(this)
>     {   title = title.dup;
>     }
> }
> void main()
> {   char[] title = "London bridge".dup;
>     const place = placeAtWorldMap(title, [51_508_038, -87_693]);
>     const samePlace = place;
>     "falling down ".copy(title);
>     place.title.writeln; // falling down
>     samePlace.title.writeln; // London bridge
>     readln;
> }
>
> ...but it compiles and correctly runs, and I'm happy about that.

Quote from the article:

> . That means that any member
> variables which are const or immutable are stuck at whatever 
> they were in
> the original object, because it would violate the type system 
> to mutate them

Meaning that if you declare your `title` member `const char[] 
title`, you can't change it in the postblit, but you could set it 
in the constructor.

```
import std.array;
import std.stdio;
import std.algorithm;

struct placeAtWorldMap
{   const char[] title;
     int[2] coordsMicroDeg;

     this(char[] name)
     {
         this.title = name.idup;          // you can assign const 
members here
     }

     this(char[] name, int[2] coords)
     {
         this.title = name;
         this.coordsMicroDeg = coords;
     }

     this(this)
     {//   title = title.dup;    // doesn't work anymore
     }
}

void main()
{   char[] title = "London bridge".dup;
     const place = placeAtWorldMap(title, [51_508_038, -87_693]);
     const newPlace = placeAtWorldMap("Big Ben".dup);
     const samePlace = place;
     "falling down ".copy(title);
     place.title.writeln; // falling down
     samePlace.title.writeln; // London bridge
     newPlace.title.writeln;      // Big Ben
}
```


More information about the Digitalmars-d-announce mailing list