$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] C++03 unique_ptr emulation
From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2009-01-09 10:43:15
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