@@ -148,20 +148,34 @@ struct ubiq_rref_base_asserting {
148148 }
149149};
150150
151- template <class T , std::size_t I0, std::size_t ... I, class /* Enable*/ = std::enable_if_t <std::is_copy_constructible<T>::value>>
151+ template <class T , std::size_t I0, std::size_t ... I, class /* Enable*/ = std::enable_if_t <std::is_copy_constructible<T>::value and !std::is_aggregate_v<T> >>
152152constexpr auto assert_first_not_base (std::index_sequence<I0, I...>) noexcept
153153 -> std::add_pointer_t<decltype(T{ ubiq_lref_base_asserting<T>{}, ubiq_lref_constructor{I}... })>
154154{
155155 return nullptr ;
156156}
157157
158- template <class T , std::size_t I0, std::size_t ... I, class /* Enable*/ = std::enable_if_t <!std::is_copy_constructible<T>::value>>
158+ template <class T , std::size_t I0, std::size_t ... I, class /* Enable*/ = std::enable_if_t <!std::is_copy_constructible<T>::value and !std::is_aggregate_v<T> >>
159159constexpr auto assert_first_not_base (std::index_sequence<I0, I...>) noexcept
160160 -> std::add_pointer_t<decltype(T{ ubiq_rref_base_asserting<T>{}, ubiq_rref_constructor{I}... })>
161161{
162162 return nullptr ;
163163}
164164
165+ template <class T , std::size_t I0, std::size_t ... I, class /* Enable*/ = std::enable_if_t <std::is_copy_constructible<T>::value and std::is_aggregate_v<T>>>
166+ constexpr auto assert_first_not_base (std::index_sequence<I0, I...>) noexcept
167+ -> std::add_pointer_t<decltype(T{ ubiq_lref_base_asserting<T>{}, {ubiq_lref_constructor{I}}... })>
168+ {
169+ return nullptr ;
170+ }
171+
172+ template <class T , std::size_t I0, std::size_t ... I, class /* Enable*/ = std::enable_if_t <!std::is_copy_constructible<T>::value and std::is_aggregate_v<T>>>
173+ constexpr auto assert_first_not_base (std::index_sequence<I0, I...>) noexcept
174+ -> std::add_pointer_t<decltype(T{ ubiq_rref_base_asserting<T>{}, {ubiq_rref_constructor{I}}... })>
175+ {
176+ return nullptr ;
177+ }
178+
165179template <class T >
166180constexpr void * assert_first_not_base (std::index_sequence<>) noexcept
167181{
@@ -180,14 +194,22 @@ constexpr auto assert_first_not_base(long) noexcept
180194
181195// /////////////////// Helpers for initializable detection
182196// Note that these take O(N) compile time and memory!
183- template <class T , std::size_t ... I, class /* Enable*/ = std::enable_if_t <std::is_copy_constructible<T>::value>>
197+ template <class T , std::size_t ... I, class /* Enable*/ = std::enable_if_t <std::is_copy_constructible<T>::value and !std::is_aggregate_v<T> >>
184198constexpr auto enable_if_initializable_helper (std::index_sequence<I...>) noexcept
185199 -> std::add_pointer_t<decltype(T{ubiq_lref_constructor{I}...})>;
186200
187- template <class T , std::size_t ... I, class /* Enable*/ = std::enable_if_t <!std::is_copy_constructible<T>::value>>
201+ template <class T , std::size_t ... I, class /* Enable*/ = std::enable_if_t <!std::is_copy_constructible<T>::value and !std::is_aggregate_v<T> >>
188202constexpr auto enable_if_initializable_helper (std::index_sequence<I...>) noexcept
189203 -> std::add_pointer_t<decltype(T{ubiq_rref_constructor{I}...})>;
190204
205+ template <class T , std::size_t ... I, class /* Enable*/ = std::enable_if_t <std::is_copy_constructible<T>::value and std::is_aggregate_v<T>>>
206+ constexpr auto enable_if_initializable_helper (std::index_sequence<I...>) noexcept
207+ -> std::add_pointer_t<decltype(T{{ubiq_lref_constructor{I}}...})>;
208+
209+ template <class T , std::size_t ... I, class /* Enable*/ = std::enable_if_t <!std::is_copy_constructible<T>::value and std::is_aggregate_v<T>>>
210+ constexpr auto enable_if_initializable_helper (std::index_sequence<I...>) noexcept
211+ -> std::add_pointer_t<decltype(T{{ubiq_rref_constructor{I}}...})>;
212+
191213template <class T , std::size_t N, class U = std::size_t , class /* Enable*/ = decltype (detail::enable_if_initializable_helper<T>(detail::make_index_sequence<N>()))>
192214using enable_if_initializable_helper_t = U;
193215
0 commit comments