std:: is_const
| Type traits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time rational arithmetic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Compile-time integer sequences | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
(C++14)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
T
>
struct is_const ; |
(начиная с C++11) | |
std::is_const
является
UnaryTypeTrait
.
Если
T
является типом с квалификатором const (то есть
const
или
const
volatile
), предоставляет константу-член
value
равную
true
. Для любого другого типа
value
равна
false
.
Если программа добавляет специализации для
std::is_const
или
std::is_const_v
, поведение не определено.
Содержание |
Параметры шаблона
| T | - | тип для проверки |
Шаблон вспомогательной переменной
|
template
<
class
T
>
constexpr bool is_const_v = is_const < T > :: value ; |
(начиная с C++17) | |
Унаследовано от std:: integral_constant
Константы-члены
|
value
[static]
|
true
если
T
является константно-квалифицированным типом,
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 <type_traits> static_assert(std::is_same_v<const int*, int const*>, "Помните, константность тесно связывается внутри указателей."); static_assert(!std::is_const_v<int>); static_assert(std::is_const_v<const int>); static_assert(!std::is_const_v<int*>); static_assert(std::is_const_v<int* const>, "Потому что сам указатель не может быть изменен, но целое число, на которое он указывает, может."); static_assert(!std::is_const_v<const int*>, "Потому что сам указатель может быть изменен, но целое число, на которое он указывает, не может."); static_assert(!std::is_const_v<const int&>); static_assert(std::is_const_v<std::remove_reference_t<const int&>>); struct S { void foo() const {} void bar() const {} }; int main() { // Константная функция-член является константной по-другому: static_assert(!std::is_const_v<decltype(&S::foo)>, "Потому что &S::foo является указателем."); using S_mem_fun_ptr = void(S::*)() const; S_mem_fun_ptr sfp = &S::foo; sfp = &S::bar; // OK, может быть перенаправлен static_assert(!std::is_const_v<decltype(sfp)>, "Потому что sfp является тем же типом указателя и, следовательно, может быть перенаправлен."); const S_mem_fun_ptr csfp = &S::foo; // csfp = &S::bar; // Ошибка static_assert(std::is_const_v<decltype(csfp)>, "Потому что csfp не может быть перенаправлен."); }
Смотрите также
|
(C++11)
|
проверяет, является ли тип квалифицированным как volatile
(шаблон класса) |
|
(C++17)
|
получает ссылку на
const
для своего аргумента
(шаблон функции) |