Boost logo

Boost :

Subject: Re: [boost] Outcome v2 is feature complete
From: Peter Dimov (lists_at_[hidden])
Date: 2017-07-11 11:21:08

Niall Douglas wrote:

> Github:
> Docs (highly incomplete):

This is a welcome development, if still a bit too-policy-heavy for my taste.

Regarding construction, I have the following suggestion.

Instead of reusing in_place_type, use the following tag types:

struct in_place_value_t
    constexpr in_place_value_t() noexcept {}

constexpr in_place_value_t in_place_value;

struct in_place_error_t
    constexpr in_place_error_t() noexcept {}

constexpr in_place_error_t in_place_error;

This is isomorphic but superior to using in_place_index<0> and
in_place_index<1>, which were my initial choice. Now the ambiguity when T ==
EC is resolved and

template<class... A> result( in_place_value_t, A&&... a );

always initializes the value and does not need to be disabled when T == EC.

In addition, I would add

template<class... A> result( A&&... a );

which initializes the value when it's constructible from a..., the error
when that's constructible from a..., and is disabled when neither or both
are constructible. (The implicit/explicit duality when sizeof...(A) == 1
complicates the actual implementation of the above but conceptually it still
works as explained. Also, the sizeof...(A) == 0 case needs to be disabled.)

Boost list run by bdawes at, gregod at, cpdaniel at, john at