ref parameters: there is no escape

Mehrdad wfunction at hotmail.com
Mon Aug 15 20:33:08 PDT 2011


On 8/15/2011 2:04 PM, Timon Gehr wrote:
> On 08/15/2011 04:04 PM, Mehrdad wrote:
>> On 8/15/2011 4:10 AM, Timon Gehr wrote: Because now you need pointers 
>> to pass things by reference?
> Only if the function intends to escape the reference. And if you 
> really need to, you can still use a cast.

... introducing D#?

     void dangerous(ref int x)
     {
         unsafe
         {
            bar(&x);
         }
     }

(i.e. "you can still use a cast" is pretty much equivalent to using C#'s 
unsafe block. Maybe C#'s done some things correctly after all, huh?...)

> Furthermore, escaping a reference is generally unsafe when it is to 
> stack memory (they can be some higher-level invariant that guarantees 
> safety, but that is not within the compilers reach -- use a cast.)

Right, so let's also ban "auto ref" as a return value, since it could be 
returning the parameter itself, without the caller's knowledge:

         auto ref trySomethingExpensive(T)(auto ref T input, bool condition)
         {
                 return condition ? doSomethingExpensive(input) : 
input;  // Optimize the input
         }

Thoughts? Should we ban ref return types, too?

> When the reference is to a value type on heap memory, you had pointers 
> in your code all along.
And that means...?
Java and C# have had pointers all along, but they're pretty darn 
successful at rendering them useless *except* for interop purposes. 
Obviously, it looks as though D is failing to achieve that same goal, 
requiring pointers for something so simple -- do we really want that?

> Warnings are issued for constructs that are regarded as potentially 
> dangerous/error-prone by many people, but are still valid code. 
> Therefore, they usually reflect suboptimal language design.

Is that why my C compiler issues "Warning: Uninitialized local variable 
p" when I run this?

     int *p;
     *p = 5;

AFAIK this is clearly *INVALID* (i.e. undefined) code according to the 
standard...


More information about the Digitalmars-d mailing list