On Saturday, 24 March 2018 at 13:49:13 UTC, Timon Gehr wrote:
What I'm saying is that I don't really buy Jonathan's argument.
Basically, you should just pass the correct arguments to
functions, as you always need to do. If you cannot use the
result of some mutation that you need to use, you will probably
notice.
I agree, but restricting it to const ref would be enough for
almost all of my use cases. The MS C++ compiler just emits a
warning when binding an rvalue to a mutable ref ('nonstandard
extension used'), I'd find that absolutely viable for D too.
There are only three sensible ways to fix the problem:
1. Just allow rvalue arguments to bind to ref parameters. (My
preferred solution, though it will make the overloading rules
slightly more complicated.)
I always thought the main concern was potential escaping refs to
the rvalue, which would be solvable by allowing rvalues to be
bound to `scope ref` params only. That'd be my preferred choice
as well.
2. Add some _new_ annotation for ref parameters that signifies
that you want the same treatment for them that the implicit
'this' reference gets. (A close second.)
*Shudder*.
3. Continue to require code bloat (auto ref) or manual
boilerplate (overloads). (I'm not very fond of this option, but
it does not require a language change.)
While `auto ref` seems to have worked out surprisingly well for
code written in D, it doesn't solve the problem when interfacing
with (many) external C++ functions taking structs (represented in
D by structs as well) by (mostly const) ref. You're forced to
declare lvalues for all of these args, uglifying the code
substantially.