On Thursday, 27 December 2012 at 05:53:23 UTC, Jonathan M Davis wrote:
No, it's not.

The example IS a const bug and have nothing to do with ref. You get a mutable reference from a literal, which is immutable in the first place.

A function which takes its argument by ref is specifically
intended to mutate its argument, otherwise it wouldn't take the argument by ref. Allowing such a parameter to be passed an rvalue makes it so that the function does not do what it's intended to do and will easily cause bugs.


A function can use ref argument for performance reasons.

C++ made it so that const& would accept rvalues with the idea that if it were const, then you obviously didn't want to mutate the argument, and you could then use it as a means to avoid unnecessary copies. But with how restrictive const is in D, we really should have a means of declaring a function parameter such that it's intended to avoid unnecessary copies but isn't necessarily const and is obviously not intended to mutate the original (though as long as the parameter isn't const, mutation is obviously still a possibility, and const is required to guarantee that that doesn't happen - _that_ could be a const-related bug). But allowing ref functions to accept rvalues is an incredibly bad idea, because it's mixing two very different idioms - taking an argument by ref in order to mutate that argument and possibly taking an argument by ref in order to avoid a copy. It never makes sense to take an
rvalue by ref. rvalue arguments need to use moves, not ref.


I have read this argument many any times, but still have to experience it in actual code.

But, thinking about it, isn't the need for an auto ref type necessary more than annotating every single function argument with ref/auto ref ?

Reply via email to