Making RCSlice and DIP74 work with const and immutable

Atila Neves via Digitalmars-d digitalmars-d at puremagic.com
Tue Mar 3 05:08:14 PST 2015


On Sunday, 1 March 2015 at 15:49:12 UTC, Jakob Ovrum wrote:
> On Sunday, 1 March 2015 at 15:40:06 UTC, Atila Neves wrote:
>> I've lost count now of how many times I've had to downgrade to 
>> auto despite always wanting immutable or const. This doesn't 
>> work:
>>
>> auto reg = regex(`(foo)`);
>> const match = "foo".matchAll(reg);
>> writeln(match.captures); //oops, captures isn't const
>>
>> It should, but it doesn't. Maxime talked about it here as well:
>>
>> http://pointersgonewild.com/2014/07/11/the-constness-problem/
>>
>> Atila
>
> `match.captures` is a range; it's only natural for a range to 
> have mutable state to be iterable.
>
> D's const is a bridge between immutable and mutable. const has 
> to be transitive because immutable is transitive. Don't use it 
> as if it was C++ const: there's no logical const in D, and if 
> there ever will be, it can't use the same `const` type 
> qualifier.

I know why it doesn't work. I know the reasons that go into the 
design decision. const has to be the way it is or else 
thread-safety goes out of the window. I'm not talking about 
logical const; I'm talking about making as many things const and 
immutable as I can to reduce the number of things I have to keep 
in my mind at any given time.

const foo = getFoo(); //no need to reason about foo anymore, it 
won't change
auto bar = getBar(); //oh-oh, now the next 50 lines can do 
whatever they want with this

I shouldn't have to make captures const if all I want to do is 
inspect the 3rd value. And yet I do. That was just one example, 
like I said I've lost count of how many times I've changed const 
to auto in my code because it wouldn't compile otherwise. I don't 
go as far as Manu as use mutable everywhere, just where I have 
to. And I'm always annoyed when it's the case.

Atila




More information about the Digitalmars-d mailing list