On Friday, 3 August 2018 at 16:46:53 UTC, Jonathan Marler wrote:
Maybe you could provide an example or 2 to demonstrate why these would be requirements...we may have 2 different ideas on how this would be implemented.

auto foo(/*mutable*/ int x)
{
   return { return ++x; };
}

void main()
{
    auto dg = foo(42);
    auto dg_copy = dg;
    // with the optimization, dg_copy would have its own context
    // in the ptr field, based on the current state in dg (42)

    const r1 = dg();
    const r2 = dg_copy(); // would be 43 with optimization
    assert(r1 == 43 && r2 == 44);
}

do you think it should always be on and the developer shouldn't need to or care to opt out of it?

Yes, by enforcing it in the language. No knowledge about this optimization necessary, no extra syntax, no extra dependency.

Also, what about the developers that want to guarantee that the optimization is occuring?

If they do know about this optimization, they probably aren't noobs and IMO should be able to have a look at LLVM IR or assembly to check whether it is optimized. The only reason for wanting to enforce it coming to my mind ad-hoc is GC-free code (-betterC, bare metal), where @nogc should do. But there are also GC-using delegates which could be optimized this way.

Reply via email to