rvalues -> ref (yup... again!)

kinke noone at nowhere.com
Sat Mar 24 14:56:31 UTC 2018


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.


More information about the Digitalmars-d mailing list