On Monday, 22 April 2013 at 17:01:43 UTC, Diggory wrote:
I like this except for the proposed "addressOf" function from DIP25 which is massively overkill. The safe-ness of & on a ref should be determined by the compiler, so that initially it could be unsafe but that could be relaxed when the compiler can determine that the pointer does not escape. Syntactic ambiguities with properties can be resolve several other ways that are simpler and clearer.

Anyway the main point I had was that everyone seems to be assuming that returning R-value references from a function is bad. (The ONLY effect "scope ref" has in DIP36, above and beyond "ref", is preventing the parameter being returned)

The fact is with DIP35 alone there is no way returning R-value references can cause unsafe-ness:

int getRValue() { return 1; }
ref int forward(ref int p) { return p; }
void other(ref int p) { /* does something interesting with p */ }

other(forward(getRValue())) // Safe because other can't leak reference

int* ptr = &(forward(getRValue())) // Would fail at compile time because "forward" is marked "ref" rather than "out" so compiler can tell that return value could be an R value reference.

forward(getRValue()) = 1 // Compiler would at least produce a warning because it can see that this code is assigning to something that could be an R-value reference. This is not unsafe just not useful.

So basically if this is implemented as suggested there is no need for special treatment of R-values, which is good!

'scope ref' would allow, that both, lvalues AND rvalues can be bound to. DIP 35 don't say anything about that.
Just to be clear:
The primary reason at all DIP 36 was created, was in general to find a possibility that accept rvalues ​​AND lvalues. That was the initial reason.

Reply via email to