Spec-Zone.ru › C++

std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable

Определён в заголовочном файле <type_traits>
template< class T, class U >
struct is_assignable;
(1) (начиная с C++11)
template< class T, class U >
struct is_trivially_assignable;
(2) (начиная с C++11)
template< class T, class U >
struct is_nothrow_assignable;
(3) (начиная с C++11)
1) Если выражение std::declval<T>() = std::declval<U>() корректно сформировано в невычисляемом контексте, предоставляется константа-член value, равная true. В противном случае value равно false. Проверки доступа выполняются так, как если бы они производились из контекста, не связанного ни с одним из типов.
2) Аналогично (1), но при вычислении выражения присваивания не вызываются операции, не являющиеся тривиальными. Для целей этой проверки вызов std::declval считается тривиальным и не считается использованием ODR std::declval.
3) Аналогично (1), но при вычислении выражения присваивания не вызываются операции, не являющиеся noexcept.

Если T или U не является полным типом, (возможно, cv-квалифицированным) типом void или массивом неизвестного размера, поведение не определено.

Если инстанцирование шаблона выше прямо или косвенно зависит от неполного типа и это инстанцирование могло бы дать другой результат, если бы этот тип гипотетически был полным, поведение не определено.

Если программа добавляет специализации для любого из шаблонов, описанных на этой странице, поведение не определено.

Вспомогательные шаблоны переменных

template< class T, class U >
constexpr bool is_assignable_v = is_assignable<T, U>::value;
(начиная с C++17)
template< class T, class U >
constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value;
(начиная с C++17)
template< class T, class U >
constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value;
(начиная с C++17)

Унаследовано от std::integral_constant

Константы-члены

value
[static]
true, если T присваиваемо из U, иначе false
(открытая статическая константа-член)

Функции-члены

operator bool
преобразует объект в bool, возвращает value
(открытая функция-член)
operator()
(C++14)
возвращает value
(открытая функция-член)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool,value>

Примечания

Эта характеристика не проверяет ничего за пределами непосредственного контекста выражения присваивания: если использование T или U приводит к специализации шаблонов, генерации неявно определённых специальных функций-членов и т. д., и при этом возникают ошибки, фактическое присваивание может не компилироваться, даже если std::is_assignable<T,U>::value компилируется и вычисляется как true.

Пример

#include <iostream>
#include <string>
#include <type_traits>

struct Ex1 { int n; };

int main()
{
    std::cout << std::boolalpha
              << "int is assignable from int? "
              << std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile
              << "int& is assignable from int? "
              << std::is_assignable<int&, int>::value << '\n' // int a; a = 1; works
              << "int is assignable from double? "
              << std::is_assignable<int, double>::value << '\n'
              << "int& is nothrow assignable from double? "
              << std::is_nothrow_assignable<int&, double>::value << '\n'
              << "string is assignable from double? "
              << std::is_assignable<std::string, double>::value << '\n'
              << "Ex1& is trivially assignable from const Ex1&? "
              << std::is_trivially_assignable<Ex1&, const Ex1&>::value << '\n';
}

Вывод:

int is assignable from int? false
int& is assignable from int? true
int is assignable from double? false
int& is nothrow assignable from double? true
string is assignable from double? true
Ex1& is trivially assignable from const Ex1&? true

См. также

is_copy_assignableis_trivially_copy_assignableis_nothrow_copy_assignable
(C++11)(C++11)(C++11)
проверяет, есть ли у типа оператор копирующего присваивания
(шаблон класса)
is_move_assignableis_trivially_move_assignableis_nothrow_move_assignable
(C++11)(C++11)(C++11)
проверяет, есть ли у типа оператор перемещающего присваивания
(шаблон класса)
assignable_from
(C++20)
задаёт требование, согласно которому тип должен быть присваиваемым из другого типа
(концепт)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_assignable

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API