The best setup would be:
1. To take lvalues by reference, write "ref".
2. To take lvalues and rvalues by reference, write "auto ref".
Everything else is superfluous and puts the burden of justification on the proposer. With DIP36, the setup would be:
1. To take lvalues by reference, write "ref".
2. To take lvalues and rvalues by reference:
2.1. Is it a template? Then write "auto ref".
2.2. Is it a non-template? Then write "scope ref".
Currently rvalues are destroyed immediately after the call they are passed into. DIP 36 would need to change that, but fails to specify it.
Our intent is to make "ref" always scoped and reserve non-scoped uses to pointers. We consider this good language design: we have unrestricted pointers for code that doesn't care much about safety, and we have "ref" which is almost as powerful but sacrifices a teeny bit of that power for the sake of guaranteed safety. Safety is guaranteed by making sure "ref" is always scoped (references can be passed down but never escape their bound value).
Andrei