On Monday, 7 August 2017 at 10:50:21 UTC, Mike wrote:
On Sunday, 6 August 2017 at 15:47:43 UTC, Moritz Maxeiner wrote:

If you use this option, do be aware that this feature has been scheduled for future deprecation [1]. It's likely going to continue working for quite a while (years), though.

[1] https://dlang.org/deprecate.html#scope%20for%20allocating%20classes%20on%20the%20stack

FYI:  http://forum.dlang.org/post/np1fll$ast$1...@digitalmars.com

"Yes, it will have to be updated - but I didn't want to adjust it before DIP1000 spec is finalized. Rationale that was driving deprecation of scope storage class is becoming obsolete with DIP1000 implemented but not before."

Thanks, I wasn't aware of this. I tried fooling around scope classes and DIP1000 for a bit and was surprised that this is allowed:

---
import core.stdc.stdio : printf;
import std.algorithm : move;

class A
{
        int i;

        this() @safe
        {
                i = 0;
        }
}

void inc(scope A a) @safe
{
        a.i += 1;
}

void print(scope A a) @trusted
{
        printf("A@%x: %d\n", cast(void*) a, a.i);
}

auto makeA() @safe
{
        scope a = new A();
        a.print();
        return move(a);
}

void main() @safe
{
        auto a = makeA();
        foreach (i; 0..10) {
                a.print();
                a.inc();
        }
}
---

You can still create a (scope) class on the stack, escape a reference to it using `move` and use it afterwards, all within the rules of @safe, so I'm not convinced that the reason for deprecating scoped classes is gone yet. Compare this to `scoped`, which behaves as expected (since it wraps the reference type object in a value type):

---
import std.typecons : scoped;

auto makeA() @trusted
{
        auto a = scoped!A();
        a.print();
        return move(a);
}

void main() @trusted
{
        auto a = makeA();
        foreach (i; 0..10) {
                a.print();
                a.inc();
        }
}
---

Reply via email to