Boost logo

Boost :

From: Niall Douglas (s_sourceforge_at_[hidden])
Date: 2019-06-27 20:53:24


> But bugs aside, this is done by testing is_nothrow_swappable_v<T>. Or,
> before C++17, with a construction similar to this:
>
>   template< typename T >
>   T& make_lvalue() noexcept;
>
>   constexpr bool is_nothrow_swappable =
>     noexcept(swap(make_lvalue<T>(), make_lvalue<T>()));

Outcome did this in v2.1.0. It didn't work right, swap() wasn't always
instanceable at the point of parsing basic_result. I replaced it with an
exact replica of std::is_nothrow_swappable, and now it works properly in
v2.1.1.

>> In other words, how can it make sense that swap<T> be noexcept without
>> considering the specific type T?

Robert, you may find studying Outcome's strong_swap() of interest.

Ref page: https://ned14.github.io/outcome/reference/functions/strong_swap/

Implementation:
https://github.com/ned14/outcome/blob/develop/include/outcome/detail/value_storage.hpp#L32

tldr; implementing the strong guarantee is much harder than it looks,
and actually offers surprisingly little benefit in practice. It's also a
pain to implement without making constexpr puke, at least in C++ 14. All
in all, the weak guarantee is likely plenty good for almost everybody
almost all of the time.

Niall


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