auto ref - again

Era Scarecrow rtcvb32 at yahoo.com
Sat Jan 26 22:13:22 PST 2013


On Sunday, 27 January 2013 at 04:38:44 UTC, deadalnix wrote:
> On Sunday, 27 January 2013 at 02:28:26 UTC, Era Scarecrow wrote:
>> Having ref accept rValues seems like a bad idea. If the source 
>> is const/immutable then it might be allowed, but more likely 
>> temporaries will be made for convertion from rValues to 
>> lValues, then passing off the temporaries. The temporaries to 
>> work right likely need to be at the top-most scope of whatever 
>> function you happen to be in; Beyond that I'm not sure how 
>> else the auto ref could be implemented safely.
>
> I have yet to see an instance of such problem in real life, but 
> quite frankly, I tired to argue.

  I would have thought it was obvious. I have done before where 
all my work was done from a ref. Now being that i wouldn't want 
to duplicate my code twice, the non-ref simply forwards to the 
ref. auto ref may automate removing the need to explicitly 
forward temporaries or make them yourself; Kinda like how scope 
makes things easier.

  For some reason opCmp is coming to mind as a good example.

   struct S {
     //90%+ of the time this will be called,
     //so without needing to do overhead we will do our compare.
     int opCmp(ref S rhs);

     //why duplicate code? Just forward to ref
     int opCmp(S rhs) {
       return this.opCmp(rhs);
     }
   }

   S l, r;
   assert(l >= r);   //uses ref
   assert(l >= S()); //uses non-ref, forwards to ref

  I remember I came up with a good reason why the temporary should 
be added to the outer scope, but the reason escapes me right now.

  But as I'm thinking about the other half having ref accept 
rValues, I would see that acceptable if the following qualified.

  1) Must be 'const ref' or 'immutable ref', no changes means 
likely no special handling.
  2) No special postblit or opAssign operations
     and/or
  3) The rValue in question is a POD (Plain Old Data)

  Since likely the rValue would have to be statically known at 
compile-time so it could create a read-only instance in the data 
portion, then refer to it. By itself it seems fairly simple to 
add in; but I'm honestly not sure, not being able to tell them 
apart when you need to seems like an annoyance, likely that C++'s 
been dealing with.


More information about the Digitalmars-d mailing list