On Monday, 16 March 2015 at 04:00:51 UTC, Zach the Mystic wrote:
"Functions and methods can be overloaded on scope. This allows
efficient passing of RC wrappers for instance..."
How does the compiler figure out which of the variables it's
passing to the parameters are `scope` or not? Does the caller
try the scoped overloads first by default, and only if there's
an error tries the non-scoped overloads? If so, what causes the
error?
Hmm... I guess it only makes sense for postblits and destructors.
I'm not sure about constructors and opAssign, so I'll leave these
out for now. I've changed the wiki page accordingly.
"To specify that the value is returned through another
parameter, the return!ident syntax can be used...
struct RC(T) if(is(T == class)) {
scope T payload;
T borrow() return { // `return` applies to `this`
return payload;
}
}"
The example contains no use of `return!ident`.
I added an example.
Also, what exactly does the `scope` on T payload get you? Is it
just a more specific version of `return` on the this parameter,
i.e. `return this.payload`? Why would you need that
specificity? What is the dangerous operation it is intended to
prevent?
Nick already answered that. I'll expand on his explanation:
Let's take the RC struct as an example. Instances of RC can
appear with and without scope. Because structs members inherit
the scope-ness from the struct, `payload` could therefore be an
unscoped pointer. It could therefore be escaped unintentionally.
By adding `scope` to its declaration, we force it to be scoped to
the structs lifetime, no matter how it's accessed.