https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91780

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|needs-reduction             |

--- Comment #8 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Reduced:

template<typename T> struct add_pointer { using type = T*; };
template<typename T> struct add_pointer<T&> { using type = T*; };
template<typename T> struct add_pointer<T&&> { using type = T*; };
template<typename T> using add_pointer_t = typename add_pointer<T>::type;

template<typename... T> struct first { };
template<typename T, typename... U> struct first<T, U...> { using type = T; };
template<typename... T> using first_t = typename first<T...>::type;

template <typename... Containers>
struct zip
{
    template <typename... Container_types>
    zip(Containers... containers) : containers_{ &containers... } { }

    add_pointer_t<first_t<Containers...>> containers_[sizeof...(Containers)];
};

template <typename... Container_types>
zip(Container_types&&... containers) -> zip<Container_types...>;

struct vector { int i = 0; };

int main()
{
  vector v1, v2;
  zip z(v1, v2);
  z.containers_[0]->i = 1;
  z.containers_[1]->i = 2;
  if (v1.i == 0)
    throw 1;
}

Reply via email to