std::is_standard_layout (3) - Linux Manuals

std::is_standard_layout: std::is_standard_layout


std::is_standard_layout - std::is_standard_layout


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

If T is a standard layout type (that is, a scalar type, a standard-layout class, or an array of such type/class, possibly cv-qualified), provides the member constant value equal true. For any other type, value is false.
A standard-layout_class is a class that satisfies StandardLayoutType.
The behavior is undefined if std::remove_all_extents_t<T> is an incomplete type and not (possibly cv-qualified) void.

Template parameters

T - a type to check

Helper variable template

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

Inherited from std::integral_constant

Member constants

value true if T is a standard-layout 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>


A pointer to a standard-layout class may be converted (with reinterpret_cast) to a pointer to its first non-static data member and vice versa.
If a standard-layout union holds two or more standard-layout structs, it is permitted to inspect the common initial part of them.
The macro offsetof can only be used with standard-layout classes.


// Run this code

  #include <iostream>
  #include <type_traits>

  struct A {
      int m;

  struct B {
      int m1;
      int m2;

  struct C {
      virtual void foo();

  int main()
      std::cout << std::boolalpha;
      std::cout << std::is_standard_layout<A>::value << '\n';
      std::cout << std::is_standard_layout<B>::value << '\n';
      std::cout << std::is_standard_layout<C>::value << '\n';



See also

is_trivially_copyable checks if a type is trivially copyable
                             (class template)

is_pod checks if a type is a plain-old data (POD) type
                             (class template)
(C++11)(deprecated in C++20)
                             byte offset from the beginning of a standard-layout type to specified member
offsetof (function macro)