# std::is_const

< cpp‎ | types

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

若 `T` 为 const 限定类型（即 const 或 const volatile ），则提供等于 true 的成员常量 `value` 。对于任何其他类型， `value` 为 false 。

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

### 模板形参

T | - | 要检查的类型

### 辅助变量模板

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

## 继承自 std::integral_constant

### 成员常量

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

### 成员函数

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

### 成员类型

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

### 注意

若 T 为引用类型则 is_const<T>::value 始终为 false 。检查可能为引用的类型的常性的正确方式是移除引用： is_const<typename remove_reference<T>::type> 。

### 可能的实现

    template<class T> struct is_const          : std::false_type {};
    template<class T> struct is_const<const T> : std::true_type {};

### 示例

    #include <iostream>
    #include <type_traits>

    int main()
    {
        std::cout << std::boolalpha
            << std::is_const_v<int> << '\n' // false
            << std::is_const_v<const int> << '\n' // true
            << std::is_const_v<const int*> /*false*/
            << " because the pointer itself can be changed but not the int pointed at\n"
            << std::is_const_v<int* const> /*true*/
            << " because the pointer itself can't be changed but the int pointed at can\n"
            << std::is_const_v<const int&> << '\n' // false
            << std::is_const_v<std::remove_reference_t<const int&>> << '\n' // true
            ;
    }

输出：

    false
    true
    false because the pointer itself can be changed but not the int pointed at
    true because the pointer itself can't be changed but the int pointed at can
    false
    true

### 参阅

is_volatile (C++11) | 检查类型是否为 volatile 限定 (类模板)
as_const (C++17) | 获得到其实参的 const 引用 (函数模板)