I wish all qualifiers were revisited with an eye for simplification
Timon Gehr
timon.gehr at gmx.ch
Tue Aug 4 17:39:07 UTC 2020
On 04.08.20 15:52, Sebastiaan Koppe wrote:
> On Tuesday, 4 August 2020 at 12:52:01 UTC, Manu wrote:
>> On Tue, Aug 4, 2020 at 5:40 PM Sebastiaan Koppe via Digitalmars-d <
>> digitalmars-d at puremagic.com> wrote:
>>> There is just one thing about shared I don't understand. If I design
>>> my object such that the non-shared methods are to be used
>>> thread-local and the shared methods from any thread, it follows that
>>> I should be able to call said shared methods from both a shared and
>>> non-shared instance of that object.
>>
>> Yes, this is a thing I talked at great length 1-2 years ago.
>> If you take shared to mean "is thread-safe", then my idea was that
>> not-shared -> shared implicit conversion should be possible.
>> What I often do is this:
>>
>> struct Thing
>> {
>> ref shared(Thing) implSharedCast() { return *cast(shared)&this; }
>> alias implSharedCast this;
>> }
>>
>> If that were an implicit conversion, that implies a slight change of
>> meaning of shared (to one that I consider immensely more useful), but
>> it's
>> more challenging for the compiler to prove with confidence, and there's a
>> lot of resistance to this change.
>
> What exactly does the compiler need to prove? The restrictions are all
> in place, you can only call shared methods on a shared object, and you
> can only access shared members in a shared method.
> ...
Nope. You can access all members, but they will be treated as `shared`.
> Hmm, well I guess if members themselves were also implicitly promoted to
> shared that could cause havoc.
Which is what the code above does, and also what Manu's "thread safe"
qualifier would do. `shared` would no longer mean "shared".
More information about the Digitalmars-d
mailing list