Persistent list

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Sun Nov 15 09:42:23 PST 2015


On Sunday, 15 November 2015 at 15:20:24 UTC, Dicebot wrote:
> On Sunday, 15 November 2015 at 15:09:25 UTC, Jonathan M Davis 
> wrote:
>> After the call to bar, the compiler can guarantee that the 
>> value of foo has not changed, because it's not possible for 
>> bar to access foo except via a const reference, and it can 
>> clearly see that, because it can see that it's not possible 
>> for bar to access foo except via the reference that's passed 
>> to it.
>
> Note that it can only do so if escape analysis is able to prove 
> no other reference escapes to the same data. Otherwise it can 
> be mutated even during that function call in other thread.

Except that shared isn't involved here. The objects are 
thread-local, so other threads don't matter. The combination of 
TLS and pure does make it so that the compiler could 
theoretically do optimizations based on const. immutable is not 
actually required, though it obviously provides far better 
guarantees.

However, even with full-on escape analysis, the compiler is 
pretty limited in where it can guarantee that a const object 
isn't mutated by another reference. So, it really doesn't mean 
much. But my point was that there _are_ cases when the compiler 
can do optimizations based on const without immutable being 
involved, even if they're rare.

>  All together it makes benefits of such deduction absolutely 
> not worth UB limitation in my opinion.

The primary benefit of making it undefined behavior to cast away 
const and mutate is that then you actually have the guarantee 
that an object will not be mutated via a const reference. You get 
actual, physical const. As long as there's a backdoor out of 
const, const provides no real guarantees. Rather, it just 
prevents accidental mutation and serves as documentation for 
which functions are supposed to be able to mutate the logical 
state on of an object - which is why (as I understand it at 
least) Walter has typically argued that C++'s const is useless.

Now, given how incredibly limiting physical const is, maybe we 
should be more lax with D's const, but if we are, we lose out on 
the compiler guarantees that we currently get and basically end 
up with a transitive version of C++'s const (except that we have 
the added risk of mutating an immutable object if we're not 
careful).

- Jonathan M Davis


More information about the Digitalmars-d mailing list