On Wednesday, 7 November 2012 at 03:35:19 UTC, Era Scarecrow
wrote:
Still that zlib entry is coming to mind. But more importantly
is that you still need code duplication to get both accessible.
//many possible combinations thereof
int func(const ref x);
int func(int x) {
return func(cast(const int) x);
}
int func(in ref int x);
int func(int x) { return func(x); }
The latter overload is for rvalues (no need to cast to const) and
wouldn't be required if the first one took rvalues directly
(having a _const_ ref parameter). That's not an example for
mutable references though, it's basically a shortcut so as to not
having to declare all rvalues for x manually.
enum ZlibEnum {}
ZlibEnum compress(void[] output, void[] input,
&ref Zlib state) nothrow pure;
string input = "something long";
ubyte[1000] output;
ubyte[5] output2;
Zlib state;
compress(output, input, null);
compress(output2, input, state);
Where's the rvalue? You're talking about an optional mutable
reference here, which is only doable via a pointer (references
cannot be null, not in C++ and not in D):
ZlibEnum compress(void[] output, void[] input, Zlib* state =
null);
...
compress(output, input);
compress(output2, input, &state);
That would be correct. But you're completely missing the point
here. Let's assume you wanted to require a state to be passed:
ZlibEnum compress(void[] output, void[] input, ref Zlib state);
You could now use:
Zlib state; // lvalue
compress(output, input, state);
but not:
compress(output, input, Zlib()); // rvalue
And that is most likely a good thing, since your state would be
lost after the compress() call. If you don't want it, you don't
pass it, and as I said, the only way to do that is to pass a
nullable pointer. So this is off-topic I'm afraid.