On Thursday, 11 June 2015 at 21:38:59 UTC, Ali Çehreli wrote:
On 06/11/2015 12:51 PM, Yuxuan Shui wrote:
> On Thursday, 11 June 2015 at 19:23:49 UTC, Ali Çehreli wrote:

>> [...]
>
> Can you explain more about why the destructor is not called
when
> returning a struct?

Are you asking in general or specific to scoped!C?

In general, D has move semantics built into the language. It depends on whether the returned expression is an rvalue or an lvalue: rvalues are moved, lvalues are copied. And the destructor will not be called for a moved object.

About returning scoped!C, I think it works:

import std.stdio;
import std.typecons;

class C
{
    ~this()
    {
        writeln("dtor");
    }
}

auto foo()
{
    auto c = scoped!C();
    return c;
}

void main()
{
    writeln("entering scope");
    {
        writeln("calling");
        auto s = foo();
        writeln("returned");
    }
    writeln("leaving scope");
}

"dtor" is printed upon leaving the scope:

entering scope
calling
returned
dtor
leaving scope

Ali

I just find out that the document of scoped says that "It's illegal to move a class instance even if you are sure there are no pointers to it. As such, it is illegal to move a scoped object."

So this is not a solution?

Reply via email to