What are all the cases that extend the lifetime of scoped objects?

Binding a delegate to a scope object extends the lifetime of that object, which would normally end upon exiting that scope. The lifetime of i is extended here:

int delegate(int) make_delegate()
{
    int i;    // lives as long as the returned delegate lives

    return (int param) {
        return i + param;         // uses i
    };
}

void main()
{
    auto del = make_delegate();
    del(42);                      // uses i
}

I was surprised to discover that, the same does not apply to struct objects, *if* the struct has a destructor:

struct S
{
    int i;

    ~this()  // prevents life extension
    {}
}

int delegate(int) make_delegate()
{
    auto s = S();

    return (int param) {
        return s.i + param;
    };
}

void main()
{
    auto del = make_delegate();
    del(42);
}

Error: variable deneme.make_delegate.s has scoped destruction, cannot build closure

Are the "life extending" cases short and simple? What are they? :)

Thank you,
Ali

Reply via email to