Thread overview
reference variables don't exist, but can simulate them
Jun 28
NonNull
Jun 28
NonNull
Jun 29
NonNull
June 28
Using gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
Please criticize:

struct refer(T) {
  T* ptr;
  this(ref T x) { ptr = &x; }
  ref T _() { return *ptr; }
  alias _ this;
  string toString() { import std.conv; return to!string(*ptr);  }
}

This will make a reference variable (simulation). [ toString() is just for writeln. ]

void main() {
    int i = 100;
    refer!int j = i;
    j = 3;
    writeln(i);
    i = 100;
    writeln(j);
    j += 3;
    writeln(i);
    refer!int k = j;
    writeln(k);
}

And a refer!int can be returned as it is just a value. Returning one that contains a pointer to a local variable leads to a compilation error.




June 28
On Sunday, 28 June 2020 at 20:59:59 UTC, NonNull wrote:
> Using gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
> Please criticize:
>
> struct refer(T) {
>   T* ptr;
>   this(ref T x) { ptr = &x; }
>   ref T _() { return *ptr; }
>   alias _ this;
>   string toString() { import std.conv; return to!string(*ptr);  }
> }
>
> This will make a reference variable (simulation). [ toString() is just for writeln. ]
>
> void main() {
>     int i = 100;
>     refer!int j = i;
>     j = 3;
>     writeln(i);
>     i = 100;
>     writeln(j);
>     j += 3;
>     writeln(i);
>     refer!int k = j;
>     writeln(k);
> }
>
> And a refer!int can be returned as it is just a value. Returning one that contains a pointer to a local variable leads to a compilation error.

* does not lead to a compilation error

June 29
On Sunday, 28 June 2020 at 21:01:36 UTC, NonNull wrote:
> On Sunday, 28 June 2020 at 20:59:59 UTC, NonNull wrote:
>> Using gdc (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
>> Please criticize:
>>
>> struct refer(T) {
>>   T* ptr;
>>   this(ref T x) { ptr = &x; }
>>   ref T _() { return *ptr; }
>>   alias _ this;
>>   string toString() { import std.conv; return to!string(*ptr);
>>  }
>> }
>>
>> This will make a reference variable (simulation). [ toString() is just for writeln. ]
>>
>> void main() {
>>     int i = 100;
>>     refer!int j = i;
>>     j = 3;
>>     writeln(i);
>>     i = 100;
>>     writeln(j);
>>     j += 3;
>>     writeln(i);
>>     refer!int k = j;
>>     writeln(k);
>> }
>>
>> And a refer!int can be returned as it is just a value. Returning one that contains a pointer to a local variable leads to a compilation error.
>
> * does not lead to a compilation error

Now with a different compiler I this:

Deprecation: Cannot use alias this to partially initialize variable j of type refer. Use j._()

This is for the line j=3

What is this about? Where does this hidden rule come from?

June 29
On Monday, 29 June 2020 at 02:11:15 UTC, NonNull wrote:

> Deprecation: Cannot use alias this to partially initialize variable j of type refer. Use j._()
>
> This is for the line j=3
>
> What is this about? Where does this hidden rule come from?

That one comes from [1]. But there are quite a few more "hidden" rules that you're violating here. Try putting @safe on your main and compiling with -preview=dip1000 (for dmd, refer to your compiler's help if you're using others). The bulk of escape analysis is only done for @safe, and only with that DIP enabled (IIRC only some trivial checks are done otherwise).

[1] https://issues.dlang.org/show_bug.cgi?id=19441