DIP 1016--ref T accepts r-values--Formal Assessment

Rubn where at is.this
Sat Jan 26 16:28:02 UTC 2019

On Saturday, 26 January 2019 at 06:15:22 UTC, Walter Bright wrote:
> On 1/25/2019 7:44 PM, Manu wrote:
>> I never said anything about 'rvalue references',
> The DIP mentions them several times in the "forum threads" 
> section. I see you want to distinguish the DIP from that; I 
> recommend a section clearing that up.
> However, my points about the serious problems with @disable 
> syntax remain.
> A section comparing with the C++ solution is necessary as well, 
> more than the one sentence dismissal. For example, how C++ 
> deals with the:
>     void foo(const int x);
>     void foo(const int& x);
> situation needs to be understood and compared. Failing to 
> understand it can lead to serious oversights. For example, C++ 
> doesn't require an @disable syntax to make it work.
>>> [...]
>>> Should `s` be promoted to an int temporary, then pass the 
>>> temporary by
>>> reference? I can find no guidance in the DIP. What if `s` is 
>>> a uint (i.e. the
>>> implicit conversion is a type paint and involves no 
>>> temporary)?
>> As per the DIP; yes, that is the point.
>> The text you seek is written: "[...]. The user should not 
>> experience
>> edge cases, or differences in functionality when calling 
>> fun(int x) vs
>> fun(ref int x)."
> I don't see how that addresses implicit type conversion at all.

Anything that could be implicitly converted to use foo(int) can 
be implicitly converted to pass a ref to the temporary that was 
implicitly converted to int into foo(ref int). No rules change in 
this regard. If you don't see how this address type conversion 
perhaps a code sample might help? The one that was given with 

void foo(ref int);
void bar(int);

bar( short(10) ); // is ok
foo( short(10) ); // expected to be ok short->int ; ref to temp 
passed to foo

Just as bar(int) can be passed a short(10), foo(ref int) can be 
passed a reference to the temporary that was created as well.

>> Don't accept naked ref unless you want these semantics. There 
>> is a
>> suite of tools offered to use where this behaviour is 
>> undesirable.
>> Naked `ref` doesn't do anything particularly interesting in the
>> language today that's not *identical* semantically to using a 
>> pointer
>> and adding a single '&' character at the callsite.
> It's not good enough. The DIP needs to specifically address 
> what happens with implicit conversions. The reader should not 
> be left wondering about what is implied. I often read a spec 
> and think yeah, yeah, of course it must be that way. But it is 
> spelled out in the spec, and reading it gives me confidence 
> that I'm understanding the semantics, and it gives me 
> confidence that whoever wrote the spec understood it.
> (Of course, writing out the implications sometimes causes the 
> writer to realize he didn't actually understand it at all.)
> Furthermore, D has these match levels:
>     1. exact
>     2. const
>     3. conversion
>     4. no match
> If there are two or more matches at the same level, the 
> decision is made based on partial ordering. How does adding the 
> new ref/value overloading fit into that?

The DIP goes over this, though not in a lot of detail. All the 
same rules apply as with the current implementation. Where there 
would be a compiler error trying to pass an rvalue would instead 
forward the value.

Effectively what is being implemented is the following (for type 
matching only):

    void foo( ref int );
    void foo( int value ) { foo( value ); }

Anything that would have been passed to foo(int) is passed to 
foo(ref int) as a reference to a temporary instead. No rules are 
changed in this regard for matching, all the same rules apply (as 
stated in the DIP). It's pretty clear, unless you can give a 
specific problem faced where this doesn't hold? D is pretty 
strict to ensure rvalues aren't passed to ref's and that's what 
makes this relatively simple to implement without changing 
matching rules.

More information about the Digitalmars-d-announce mailing list