17 using first_type = Base;
18 using second_type = Other;
20 template <
class... Ts2>
24 )
noexcept(std::is_nothrow_default_constructible_v<Base> && std::is_nothrow_constructible_v<Other, Ts2...>)
26 sec(std::forward<Ts2>(val2)...) {}
28 template <
class T1,
class... Ts2>
33 )
noexcept(std::is_nothrow_constructible_v<Base, T1> && std::is_nothrow_constructible_v<Other, Ts2...>)
34 : Base(std::forward<T1>(val1)),
35 sec(std::forward<Ts2>(val2)...) {}
37 constexpr first_type& first()
noexcept {
return *
this; }
39 constexpr first_type
const& first()
const noexcept {
return *
this; }
41 constexpr second_type& second()
noexcept {
return sec; }
43 constexpr second_type
const& second()
const noexcept {
return sec; }
52 using first_type = Base;
53 using second_type = Other;
55 template <
class... Ts2>
59 )
noexcept(std::is_nothrow_default_constructible_v<Base> && std::is_nothrow_constructible_v<Other, Ts2...>)
61 sec(std::forward<Ts2>(val2)...) {}
63 template <
class T1,
class... Ts2>
68 )
noexcept(std::is_nothrow_constructible_v<Base, T1> && std::is_nothrow_constructible_v<Other, Ts2...>)
69 : fst(std::forward<T1>(val1)),
70 sec(std::forward<Ts2>(val2)...) {}
72 constexpr first_type& first()
noexcept {
return fst; }
74 constexpr first_type
const& first()
const noexcept {
return fst; }
76 constexpr second_type& second()
noexcept {
return sec; }
78 constexpr second_type
const& second()
const noexcept {
return sec; }