
David Abrahams wrote:
on Thu Jan 08 2009, Ion Gaztañaga <igaztanaga-AT-gmail.com> wrote:
The same happens when implementing forwarding functions, so I'm starting to think that putting T() in functions taking movable-only types by value is not a bad idea ;-)
Sorry, but what do you mean by "putting T() in functions?"
putting-milk-in-his-T'ly y'rs,
void function (movable m); int main() { movable m; function(movable(boost::move(m))); function(movable()); return 0; } I mean that to pass movable-only objects per-value you need to put movable() in the argument. This is needed if boost::move returns boost::detail::rv<T> instead of T. Whether we return T or rv<T>, returning a movable type must types must construct a movable object in the return statement (see the attached test case and change the #define BOOST_MOVE_RETURN_OPTION define to play with both approaches): movable move_return_function () { if(cond){ return movable(); } else(cond){ movable m; return movable(boost::move(m)); } } This won't work in both cases: movable move_return_function () { movable m; return movable; } Returning T from move() avoids the need of explicitly specify movable() when passing arguments by value but makes forwarding really hard. On the other hand returning rv<T> makes forwarding easy but passing by value ugly. Of course, the question is if we can return something from move() that can be different from T so that forwarding is easy but has no need to specify movable() when passing by value. Regards, Ion