DIP 36: Rvalue References

Zach the Mystic reachzach at gggggmail.com
Mon Apr 22 13:09:53 PDT 2013


On Monday, 22 April 2013 at 12:22:14 UTC, Diggory wrote:
> Why not simply make escaping a "ref" pointer an unsafe 
> operation. The compiler should be able to detect this and 
> report it without any changes to the syntax.

In other words, 'scope' would be the default and require no 
explicit attribute. The first thing about this is the question of 
how much code it would break. I don't know the answer. Maybe a 
mockup of this idea could be used to create a sense of how badly 
it breaks existing code. The second question is how desirable is 
it as a feature. I think it may be quite desirable to have all 
refs be 'scope' by default, because the most common case will be 
the default, that refs will not be assigned to globals. Since 
there is a difference between the safety of returning by ref and 
the safety of assigning to heap or global addresses, there may 
need to be a distinction made between these two types of 'escape'.

> This should cover 99% of cases with no extra attributes 
> required and no limitations on what you can do with a "ref" 
> within the function. In the 1% of cases that a pointer needs to 
> be escaped safely you can add an attribute (maybe "heap ref" or 
> something, although perhaps some existing syntax could be used) 
> that requires the input to have been allocated on the heap.

'@noscope ref' has also been suggested, since the reference in 
question would also need to include static global data.

> In the case that a stack variable is passed as a "heap ref" 
> parameter the compiler can automatically promote it where 
> possible, or if that's not possible, such as the variable being 
> marked "scope" (existing meaning) then it should complain.

This is interesting to me. The only drawback I can think of is 
the aversion people have to introducing code which could secretly 
allocate, since many people want to avoid the garbage collector. 
It would only be an issue if the automatic promotion looked so 
much like a normal function call that it was extraordinarily 
difficult to distinguish it.

> As far as I'm aware the only real purpose for R-value 
> references is to implement move semantics. This could already 
> be done using "ref in" syntax, as that makes no guarantees that 
> the value is not going to be destroyed, only says that the 
> value should be initialised prior to it being passed in. The 
> only change would be to allow passing temporaries as "ref in".

The only existing definition of 'in' is that it means 'const 
scope', so it already means scope. I don't know if that is a good 
definition or not. I think that there remains a significant fear 
in this community of introducing changes which will break 
existing code. I don't myself know how justified this fear is, 
but it is nonetheless something to take very seriously when 
proposing new ideas.

> I realise I'm new here

I'm new too. I'm glad to be able to have this discussion with you 
despite both of our being new. :-)


More information about the Digitalmars-d mailing list