std::is_empty (3) - Linux Manuals

std::is_empty: std::is_empty


std::is_empty - std::is_empty


Defined in header <type_traits>
template< class T > (since C++11)
struct is_empty;

If T is an empty type (that is, a non-union class type with no non-static data members other than bit-fields of size 0, no virtual functions, no virtual base classes, and no non-empty base classes), provides the member constant value equal true. For any other type, value is false.
If T is a non-union class type, T shall be a complete type; otherwise, the behavior is undefined.

Template parameters

T - a type to check

Helper variable template

template< class T > (since C++17)
inline constexpr bool is_empty_v = is_empty<T>::value;

Inherited from std::integral_constant

Member constants

value true if T is an empty class type , false otherwise
         (public static member constant)

Member functions

              converts the object to bool, returns value
operator bool (public member function)

operator() returns value
              (public member function)

Member types

Type Definition
value_type bool
type std::integral_constant<bool, value>


Inheriting from empty base classes usually does not increase the size of a class due to empty_base_optimization.
std::is_empty<T> and all other type traits are empty classes.


// Run this code

  #include <iostream>
  #include <type_traits>

  struct A {};

  struct B {
      int m;

  struct C {
      static int m;

  struct D {
      virtual ~D();

  union E {};

  struct F {
      [[no_unique_address]] E e;

  int main()
      std::cout << std::boolalpha;
      std::cout << "A " << std::is_empty<A>::value << '\n';
      std::cout << "B " << std::is_empty<B>::value << '\n';
      std::cout << "C " << std::is_empty<C>::value << '\n';
      std::cout << "D " << std::is_empty<D>::value << '\n';
      std::cout << "E " << std::is_empty<E>::value << '\n';
      std::cout << "F " << std::is_empty<F>::value << '\n'; // the result is ABI-dependent


Possible output:

  A true
  B false
  C true
  D false
  E false
  F true

See also

is_class checks if a type is a non-union class type
         (class template)