Why is `scope` planned for deprecation?

via Digitalmars-d digitalmars-d at puremagic.com
Thu Nov 13 09:17:17 PST 2014


On Thursday, 13 November 2014 at 16:56:01 UTC, Nick Treleaven 
wrote:
> On 12/11/2014 17:16, "Marc Schütz" <schuetzm at gmx.net>" wrote:
>> On Wednesday, 12 November 2014 at 15:57:18 UTC, Nick Treleaven 
>> wrote:
>>> For example, taking a mutable borrowed pointer for a variable 
>>> means
>>> you can't even *read* the original variable whilst the 
>>> pointer lives.
>>> I think no one would try to make D do that, but Rust's reason 
>>> for
>>> adding it is actually memory safety (I don't quite understand 
>>> it, but
>>> it involves iterator invalidation apparently). It's possible 
>>> their
>>> feature can be refined, but basically 'mut' in Rust really 
>>> means
>>> 'unique'.
>>
>> In my proposal, there's "const borrowing". It still allows 
>> access to the
>> owner, but not mutation. This is necessary for safe 
>> implementation of
>> move semantics, and to guard against iterator invalidation. It 
>> also has
>> other uses, like the problems with "transient range", e.g.
>> stdin.byLine(), which overwrite their buffer in popFront(). On 
>> the other
>> hand, it's opt-in; by default, owners are mutable while 
>> borrowed
>> references exist.
>
> Looks good. Personally I've been meaning to study your (whole) 
> proposal, I think its a valuable analysis of what problems we 
> could/should solve.
>
> Just from a quick look, I wonder if 'const borrowing' could 
> solve the scoped!C premature destruction problem:
>
> C c = std.typecons.scoped!C();
> // memory for c has already been freed (need auto c = ...)
>
> If the destruction of Scoped is disallowed whilst an (implicit 
> alias this) borrow for c is alive, the compiler can generate an 
> error.

Const borrowing is not even necessary for that. The problem with 
`std.typecons.scoped!C` is that it implicitly converts to `C`. 
Instead, it should only convert to `scope!this(C)`, then the 
assignment will be rejected correctly:

     // ERROR: type mismatch: C != scope(C)
     C c = std.typecons.scoped!C();
     // ERROR: `c` outlives it's owner (temporary)
     scope(C) c = std.typecons.scoped!C();
     // OK: typeof(c) is now scoped!C
     auto c = std.typecons.scoped!C();


More information about the Digitalmars-d mailing list