On 2012-12-30 22:29:33 +0000, Jonathan M Davis <[email protected]> said:

Good point. Member variables of parameters also cause problems. So, it very
quickly devolves to any function which accepts a user-defined type by ref and
returns anything by ref would have to be @system, which is far from pleasant.

Note that the above definition includes every struct member function that returns a ref because of the implicit this parameter.

Also, it's not just functions returning by ref, it could be a function returning a delegate too, if the delegate happens to make use of the reference:

void delegate() foo(ref int a) {
   return { writeln(a); };
}

void delegate() bar() {
   int a;
   return foo(a); // leaking reference to a beyond bar's scope
}

And similar to passing a value by ref: you can pass a slice to a static array, then return the slice:

int[] foo(int[] a) {
        return a;
}

int[] bar() {
        int[2] a;
        return foo(a[]);
}

Three variations on the same theme.

--
Michel Fortin
[email protected]
http://michelf.ca/

Reply via email to