table of contents
        
      
      
    - Tumbleweed 2024.07.05-1.3
 - Leap-16.0
 - Leap-15.6
 
| std::is_aggregate(3) | C++ Standard Libary | std::is_aggregate(3) | 
NAME¶
std::is_aggregate - std::is_aggregate
Synopsis¶
 Defined in header <type_traits>
  
   template< class T > (since C++17)
  
   struct is_aggregate;
  
   std::is_aggregate is a UnaryTypeTrait.
  
   If T is an aggregate type, provides the member constant value equal true. For
    any
  
   other type, value is false.
  
   If T is an incomplete type other than an array type or (possibly
    cv-qualified) void,
  
   the behavior is undefined.
  
   If the program adds specializations for std::is_aggregate or
    std::is_aggregate_v,
  
   the behavior is undefined.
Template parameters¶
T - a type to check
  
   Helper variable template
  
   template< class T > (since C++17)
  
   inline constexpr bool is_aggregate_v = is_aggregate<T>::value;
Inherited from std::integral_constant
Member constants¶
 value true if T is an aggregate type, false otherwise
  
   [static] (public static member constant)
Member functions¶
 operator bool converts the object to bool, returns value
  
   (public member function)
  
   operator() returns value
  
   (C++14) (public member function)
Member types¶
 Type Definition
  
   value_type bool
  
   type std::integral_constant<bool, value>
Notes¶
 Feature-test macro Value Std Feature
  
   __cpp_lib_is_aggregate 201703L (C++17) std::is_agregate
Example¶
// Run this code
  
   #include <new>
  
   #include <type_traits>
  
   #include <utility>
  
   // constructs a T at the uninitialized memory pointed to by p using
  
   // list-initialization for aggregates and non-list initialization otherwise
  
   template<class T, class... Args>
  
   T* construct(T* p, Args&&... args)
  
   {
  
   if constexpr (std::is_aggregate_v<T>)
  
   return ::new (static_cast<void*>(p))
    T{std::forward<Args>(args)...};
  
   else
  
   return ::new (static_cast<void*>(p))
    T(std::forward<Args>(args)...);
  
   }
  
   struct A { int x, y; };
  
   struct B { B(int, const char*) {} };
  
   int main()
  
   {
  
   std::aligned_union_t<1, A, B> storage;
  
   [[maybe_unused]] A* a = construct(reinterpret_cast<A*>(&storage),
    1, 2);
  
   [[maybe_unused]] B* b = construct(reinterpret_cast<B*>(&storage),
    1, "hello");
  
   }
  
   Defect reports
  
   The following behavior-changing defect reports were applied retroactively to
  
   previously published C++ standards.
  
   DR Applied Behavior as published Correct behavior
  
   to
  
   The behavior is undefined if T is an The behavior is defined
  
   LWG array type but regardless of the
  
   3823 C++17 std::remove_all_extents_t<T> is an incompleteness of
  
   incomplete type. std::remove_all_extents_t<T>
  
   as long as T is an array type.
| 2024.06.10 | http://cppreference.com |