17 using first_type = Base;
18 using second_type = Other;
20 template <
class... Ts2>
22 std::is_nothrow_default_constructible_v<Base> && std::is_nothrow_constructible_v<Other, Ts2...>
25 sec(std::forward<Ts2>(val2)...) {}
27 template <
class T1,
class... Ts2>
29 std::is_nothrow_constructible_v<Base, T1> && std::is_nothrow_constructible_v<Other, Ts2...>
31 : Base(std::forward<T1>(val1)),
32 sec(std::forward<Ts2>(val2)...) {}
34 constexpr first_type& first()
noexcept {
return *
this; }
36 constexpr first_type
const& first()
const noexcept {
return *
this; }
38 constexpr second_type& second()
noexcept {
return sec; }
40 constexpr second_type
const& second()
const noexcept {
return sec; }
49 using first_type = Base;
50 using second_type = Other;
52 template <
class... Ts2>
54 std::is_nothrow_default_constructible_v<Base> && std::is_nothrow_constructible_v<Other, Ts2...>
57 sec(std::forward<Ts2>(val2)...) {}
59 template <
class T1,
class... Ts2>
61 std::is_nothrow_constructible_v<Base, T1> && std::is_nothrow_constructible_v<Other, Ts2...>
63 : fst(std::forward<T1>(val1)),
64 sec(std::forward<Ts2>(val2)...) {}
66 constexpr first_type& first()
noexcept {
return fst; }
68 constexpr first_type
const& first()
const noexcept {
return fst; }
70 constexpr second_type& second()
noexcept {
return sec; }
72 constexpr second_type
const& second()
const noexcept {
return sec; }