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.