aggregate

An aggregate is one of the following types:
* array type
* class type (typically, struct or union), that has
    * no private or protected non-static data members
    * no user-provided, inherited, or explicit constructors
    * no user-declared or inherited constructors
    * no virtual, private, or protected (since C++17) base classes
    * no virtual member functions