
On Wed, Apr 9, 2008 at 11:11 PM, shunsuke <pstade.mb@gmail.com> wrote:
Eric Niebler wrote:
Anyway, about the rvalue_wrapper<> Shunsuke proposed and I just endorsed. The issue is that today, users are writing code like this:
int const i = 0; fusion::tuple<int> t = fusion::make_tuple(i);
This is arguably wrong because it is storing an lvalue by value. This is probably more correct:
int const i = 0; fusion::tuple<int const &> t = fusion::make_tuple(i);
It seems to depend on context or domain. Proto may expect it, but
int const i = 0; return fusion::make_tuple(i);
would be "ouch".
Also would be "ouch" for: struct handler { typedef void result_type; result_type operator()(int i) const { } }; int const i = 0; sock_->async_read( buffer, fusion::fused(handler(), fusion::make_vector(i)) );
BTW, Egg offers "pack", which captures all the arguments by-reference.
I prefer by-value by default. Afterall, C++ is a value-based language. [snip]
As shown above, lvalue/rvalue-ness doesn't guarantee the complete safety. FWIW, I usually prefer compatibility. :-)
I would say lvalue/rvalue-ness are safe only when used for reusing temporaries.
Regards, -- Shunsuke Sogame
Regards, -- Felipe Magno de Almeida