I feel this is best explained with a testcase: This is the error DMD gives: test.d(21): Error: arryacc(3LU) is not an lvalue code: ##### class A { private size_t size = 5; auto newArrayAccessor(T)() { T[] a = new T[size]; ref T accessor(size_t i) { return a[i]; } return &accessor; } } void main() { uint[5] arry; ref uint acc(size_t i) { return arry[i]; } acc(3) = 5; // works auto a = new A; auto arryacc = a.newArrayAccessor!(uint)(); arryacc(3) = 5; // doesn't work. What gives? }
Simplified testcase (by q66): void main() { uint[5] arry; ref uint acc(size_t i) { return arry[i]; } auto arryacc = &acc; arryacc(3) = 5; // same error }
https://github.com/D-Programming-Language/dmd/pull/933
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/5a9b927ae2501aac795c03d1cd6be79188e1e197 fix Issue 8064 - return reference semantics not obeyed on delegates? https://github.com/D-Programming-Language/dmd/commit/813a0216b2a205fb06bd8d02d7c667317c7b5ce4 Merge pull request #933 from 9rnsr/fix8064 Issue 8064 - return reference semantics not obeyed on delegates?