# std::is_scalar

< cpp‎ | types

定义于头文件 `<type_traits>` |  |
template< class T > struct is_scalar; |  | (C++11 起)

若 `T` 为标量类型（即可有 cv 限定的算术、指针、指向成员指针、枚举或 std::nullptr_t 类型），则提供等于 true 的成员常量 `value` 。对于任何其他类型， `value` 为 false 。

添加 `is_scalar` 或 `is_scalar_v` (C++17 起) 的特化的程序行为未定义。

### 模板形参

T | - | 要检查的类型

### 辅助变量模板

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

## 继承自 std::integral_constant

### 成员常量

value [静态] | 若 `T` 是标量类型则为 true ，否则为 false (公开静态成员常量)

### 成员函数

operator bool | 转换对象为 bool ，返回 `value` (公开成员函数)
operator() (C++14) | 返回 `value` (公开成员函数)

### 成员类型

类型 | 定义
`value_type` | `bool`
`type` | std::integral_constant<bool, value>

### 注意

C++ 内存模型中的每个独立内存位置，包括语言特性所用的隐藏内存位置（如虚表指针），都拥有标量类型（或为相邻的零长位域序列）。表达式求值中的副效应排序、线程间同步和依赖顺序全部都基于标量对象定义。

### 可能的实现

    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> {};

### 示例

    #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

### 参阅

is_arithmetic (C++11) | 检查类型是否为算术类型 (类模板)
is_enum (C++11) | 检查类型是否是枚举类型 (类模板)
is_pointer (C++11) | 检查类型是否为指针类型 (类模板)
is_member_pointer (C++11) | 检查类型是否为指向非静态成员函数或对象的指针类型 (类模板)