Boost logo

Boost :

Subject: Re: [boost] [optional] get() misses optional r-value overload in contrast to operator* and value()
From: Gavin Lambert (gavinl_at_[hidden])
Date: 2018-03-25 22:12:18


On 25/03/2018 13:50, Peter Dimov wrote:
> No, both are correct; optional::value()&& returns an rvalue reference to
> the value inside the optional, to which the auto&& or auto const& binds.
> When the optional temporary is destroyed, this reference becomes dangling.

Doesn't this problem go away if value()&& is removed entirely, or at
least changed to return by value instead?

Granted I haven't done much delving into the darker corners of C++11,
but I've usually found that outside of implementing std::move itself,
anything that returns a T&& is probably a bug waiting to happen.

>    T&& value()&& { return std::move(t_); }

In this case, this should be just as efficient:

     T value()&& { return std::move(t_); }

Especially with improved elision guarantees in more recent standards and
compilers.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk