
On 11/06/2012 13:14, Giovanni Piero Deretta wrote:
Apart from the fact that "an arbitrary place" in your sentence would seem to cover anything
You don't get to choose where. The compiler does.
to what subobject are you referring to?
Any subobject. Or any specific storage really.
The only thing I can think of is assignment operators of derived classes that need to forward to base classes. In that case I agree that pass by value does not work very well (I usually still use pass by value, but implement operator= in term of swap, which forwards to the base class swap).
According to this rule, I should pass by value whenever I want to copy the variable anyway. template<class T> struct foo { T t; foo(T t_) : t(t_) {} }; Clearly we can see this code causes one copy with rvalues, two with lvalues, instead of always one if we used const-reference. The only instance where this might be useful is operator=, and then again, it's probably still a bad idea. I had already pointed out to Dave that the way the rule as worded was incorrect.