Why can't we make reference variables?

Tommi tommitissari at hotmail.com
Wed Aug 29 12:55:05 PDT 2012


On Wednesday, 29 August 2012 at 14:17:21 UTC, Era Scarecrow wrote:
>  Then most of my examples change to going into the constructor 
> rather than out, and the global one goes away. But it still 
> doesn't help with the problem of anything stack allocated.
>
>  struct S {
>    //default construtor otherwise then fails to work because of 
> ref? Since
>    //x must be known at compile time so it would be null to 
> start with, or no
>    //default onstructor
>    ref int x;
>    this(ref int r) { x = r;}
>  }
>
>  S func() {
>    int local = 42;
>    S s = S(local);
>    return s;
>  }
>
>  S func(ref int reffed) {
>    S s = S(reffed);
>    return s;
>  }
>
>  S s = func();
>
>  writeln(s.x); //mystery value still!
>
>  {
>    int local = 42;
>    s = func(local);
>    writeln(s.x); //42
>  }
>
>  writeln(s.x); //!?!?
>
>
>  Unless I'm understanding this wrong (And I'm tired right now 
> maybe I missed something), once again the only safe 'reference 
> variable' is from actively being called from a live accessible 
> reference; And anything else is still a ticking timebomb and 
> cannot ever be @safe. Stuff referencing within heaped/class 
> related stuff may suffer fewer problems, but only as long as 
> you rely on the GC and not do any magic involving malloc/free, 
> or maybe a dynamic range.
>
>  Reminds me. The example for the foreach are missing parts.
>
>  int[10] fixed;
>  int[] dynamic;
>  dynamic.length = 10;
>
>  foreach(i; fixed) {
>     //fine, i is a copy
>  }
>
>  foreach(ref i; fixed) {
>      //compile-time error for @safe checking
>      //cannot ensure this is safe otherwise
>  }
>
>  foreach(i; dynamic) {
>     //fine, i is a copy
>  }
>
>  foreach(ref i; dynamic) {
>     //Dynamic/heap allocated, so fine.
>  }
>
>  //from function/ref
>  void func(int[] huh) {
>    foreach(ref i; huh) {
>      //????? safe?
>    }
>  }
>
>  //both legal last I checked.
>  func(fixed);
>  func(dynamic);
>
>
>
>  My god, as I look at this more, reference variables would 
> cripple D so badly C++ wouldn't look half bad afterwards.

I honestly don't know anything about memory safety and what it 
entails. So, I can't comment about any of that stuff. But if you 
say general ref variables can't be implemented in @safe mode, 
then I can just take your word for it. But what I'm saying is 
that ref variables would be a nice feature to have in @system 
code.

My logic is very simple: since we can use pointers in @system 
code, and references are no more unsafe than pointers, then we 
should be able to use references in @system code. You might argue 
that references are little more than syntactic sugar (and a bit 
safer) compared to pointers, but you shouldn't underestimate the 
importance of syntactic sugar especially when you're trying to 
lure in users of C++.


More information about the Digitalmars-d mailing list