On Sunday, 21 October 2018 at 09:58:18 UTC, Walter Bright wrote:
On 10/20/2018 11:08 AM, Nicholas Wilson wrote:
You can if no-one else writes to it, which is the whole point
of Manu's proposal. Perhaps it should be const shared instead
of shared but still.
There is no purpose whatsoever to data that can be neither read
nor written. Shared data is only useful if, at some point, it
is read/written, presumably by casting it to unshared in
@trusted code. As soon as that is done, you've got a data race
with the other existing unshared aliases.
Just a thought: if a hard requirement is made on `shared` data to
be non-copyable, a @safe conversion could be guaranteed. But it
can't be implicit either:
shared(T) share(T)(T value) if (!is(T == shared) &&
!isCopyable!T) {
shared(T) result = move(value);
return result;
}
struct ShareableData {
@disable <postblit and/or copy ctor>; // Generated by
compiler in presence of `shared` members and/or `shared` methods
/* ... */
}
void sendToThread(T)(shared T* ptr) @safe;
void usage() @safe {
int x;
sendToThread(&x); // Error: 'x' is not shared
shared y = x; // Ok
sendToThread(&y); // Ok
ShareableData data;
sendToThread(&data); // Error: 'data' is not shared
auto p = &data;
sendToThread(p); // Error: *p is not shared
auto sharedData = share(move(data));
sendToThread(&sharedData); // Ok
auto yCopy = y; // Error: cannot copy 'shared' y
auto dataCopy = sharedData; // Error: cannot copy 'shared'
sharedData
ShareableData otherData;
sendToThread(cast(shared(ShareableData)*) &otherData); //
Error non-@safe cast in @safe code
}
And again, we're back to 'once it's shared, it can't be @safe-ly
unshared', which ruins the distinction between owned and shared
references, which is one of the nicer properties that Manu's
proposal seems to want to achieve :(