std::is_scalar (3) - Linux Manuals

std::is_scalar: std::is_scalar


std::is_scalar - std::is_scalar


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

If T is a scalar_type (that is a possibly cv-qualified arithmetic, pointer, pointer_to_member, enumeration, or std::nullptr_t type), provides the member constant value equal true. For any other type, value is false.

Template parameters

T - a type to check

Helper variable template

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

Inherited from std::integral_constant

Member constants

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


Each individual memory location in the C++ memory model, including the hidden memory locations used by language features (e.g virtual table pointer), has scalar type (or is a sequence of adjacent bit-fields of non-zero length). Sequencing of side-effects in expression evaluation, interthread synchronization, and dependency ordering are all defined in terms of individual scalar objects.

Possible implementation

  template< class T >
  struct is_scalar : std::integral_constant<bool,
                       std::is_arithmetic<T>::value ||
                       std::is_enum<T>::value ||
                       std::is_pointer<T>::value ||
                       std::is_member_pointer<T>::value ||
                       std::is_null_pointer<T>::value> {};


// Run this code

  #include <iostream>
  #include <type_traits>

  int main() {
      class cls {};
      std::cout << (std::is_scalar<int>::value
                       ? "T is a scalar"
                       : "T is not a scalar") << '\n';
      std::cout << (std::is_scalar<cls>::value
                       ? "T is a scalar"
                       : "T is not a scalar") << '\n';


  T is a scalar
  T is not a scalar

See also

is_arithmetic checks if a type is an arithmetic type
                  (class template)

is_enum checks if a type is an enumeration type
                  (class template)

is_pointer checks if a type is a pointer type
                  (class template)

is_member_pointer checks if a type is a pointer to an non-static member function or object
                  (class template)