Passing a reference to a returned reference

Timoses timosesu at gmail.com
Fri Jul 6 15:57:27 UTC 2018


On Friday, 6 July 2018 at 15:33:18 UTC, Michael wrote:
>
> This is definitely to do with my use of the setter syntax, 
> which maybe I am misunderstanding? Because if I change it to a 
> normal function call like so:
>
> a.beliefs(Operator.create());
>
> then it complains if I use ref, and doesn't complain if I don't.

You can try removing the "auto" from the Operator class method

// Error: returning dict escapes a reference to local variable 
dict
false
         static ref create()
         {
             double[int] dict;
             dict[2] = 1.0;
             dict[1] = 0.0;
             return dict;
         }

That indicates that 'dict' is actually returned by value (at 
least the reference). This sounds a bit confusing.
AFAIK, in above code a reference 'dict' is created pointing 
towards memory that stores that dictionary entries. The reference 
itself is a "pointer"(?) which will "die" when running out of the 
method's scope. This pointer lives on the function's stack. So 
returning this "pointer" (essentially a value type, e.g. int) 
will return it by value.

You could return a reference like so:

     class Operator
     {
         static double[int] hdict;
         static this()
         {
              hdict[2] = 1.0;
              hdict[1] = 0.0;
         }
         static ref create()
         {
             return hdict;
         }
     }

then

> a.beliefs(Operator.create());

should work on the "ref" setter.


More information about the Digitalmars-d-learn mailing list