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 >
inline constexpr bool is_assignable_v = is_assignable<T, U>::value;
(с C++17)
template< class T, class U >
inline constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value;
(с C++17)
template< class T, class U >
inline 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/w/cpp/types/is_assignable

Spec-Zone.ru

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