Defined in Independent computations compose side by side The conjunction keeps both results values multiply into a and errors sum into a with the leftmost failing operand s error held at runtime Each carrier s header declares its own this header defines the n ary fold over it The verb object conjoin The operator The binary conjunction each carrier declares is its n ary fold Call signatures a & b pack copack & conjoin_t conjoin 1 The n ary conjunction conjoin a b c The n ary fold of operator & above a single argument is forwarded unchanged Two modes never mixed in one call with every argument a computation carrier the fold is the monadic conjunction exactly what cascading operator & produces and with none of them a carrier it is the data level product a leading scalar lifted into a pack first A mixed argument list is refused rather than resolved by the leading argument conjoin template <typename Lh typename Rh> constexpr auto operator& Lh &&lh Rh &&rh 1 constexpr auto operator& Lh && Rh &&rh > std remove_cvref_t<Rh> 2 constexpr auto operator& Lh &&lh Rh && > std remove_cvref_t<Lh> 3 constexpr auto operator& Lh &&lh Rh &&rh 4 template <typename Lh some_expected Rh> constexpr auto operator& Lh &&lh Rh &&rh 5 template <some_expected Lh typename Rh> constexpr auto operator& Lh &&lh Rh &&rh 6 template <typename Lh some_expected_void Rh> constexpr auto operator& Lh &&lh Rh &&rh > expected<typename std remove_cvref_t<Lh> value_type typename std remove_cvref_t<Rh> error_type> 7 template <some_expected_void Lh typename Rh> constexpr auto operator& Lh &&lh Rh &&rh > expected<typename std remove_cvref_t<Rh> value_type typename std remove_cvref_t<Lh> error_type> 8 template <typename Lh some_expected Rh> constexpr auto operator& Lh && Rh &&rh 9 template <some_expected Lh typename Rh> constexpr auto operator& Lh &&lh Rh && 10 template <typename Lh typename Rh> constexpr auto operator& Lh &&lh Rh &&rh 11 constexpr auto operator& Lh && Rh &&rh > std remove_cvref_t<Rh> 12 constexpr auto operator& Lh &&lh Rh && > std remove_cvref_t<Lh> 13 template <some_optional Lh some_optional Rh> constexpr auto operator& Lh &&lh Rh &&rh 14 template <typename Lh some_optional Rh> constexpr auto operator& Lh &&lh Rh &&rh 15 template <some_optional Lh typename Rh> constexpr auto operator& Lh &&lh Rh &&rh 16 template <typename Lh some_optional Rh> constexpr auto operator& Lh && Rh &&rh 17 template <some_optional Lh typename Rh> constexpr auto operator& Lh &&lh Rh && 18 constexpr auto operator& auto &&lh auto &&rh 19 The conjunction of carriers values multiply into a pack errors sum into a copack a & b succeeds only where both operands do the values folding into one pack a void side elides and a copack value distributes into a copack of packs What the failure side carries depends on the carrier an expected holds the leftmost failing operand s error an identical pair of error types staying as it is and any other pair summing into its normalized copack_for grading not required of the operands an optional is simply empty its unit error needing no summing a choice or just cannot fail so the fold is total Both operands are fully constructed before the operator runs an error selection rule not short circuiting An identity cluster operand contributes its value and no error term return The carrier of the folded value product over the summed failure side lh Lh && Left operand rh Rh && Right operand The data conjunction concatenates into a pack distributing over copack alternatives With plain data on both sides the fields concatenate into one flat pack When either operand is a copack the product distributes over its alternatives two copacks yield the full cartesian product producing a normalized copack of pack s Dispatches on its left operand a bare scalar & scalar is not part of the algebra so lift one side first as in fn as_pack a & b return A pack or a copack of pack s where alternatives distribute lh auto && A pack or a copack rh auto && The data to conjoin a scalar a pack or a copack template <typename Arg> constexpr auto operator Arg &&arg const > decltype arg 1 template <typename Arg typename Args> constexpr auto operator Arg &&arg Args && args const 2 Forwards a single argument unchanged return The argument forwarded arg Arg && The argument Folds data into a product or carriers into their conjunction With no carrier among the arguments the fold is the data level product a leading scalar is lifted into a pack first and a leading pack or copack dispatches operator & itself With every argument a carrier the same fold is their monadic conjunction return The folded product or the folded conjunction arg Arg && The leading argument args Args && Further arguments all data or all carriers never the two mixed