Пространства имён
Варианты
Действия

std::is_copy_assignable, std::is_trivially_copy_assignable, std::is_nothrow_copy_assignable

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
is_copy_assignableis_trivially_copy_assignableis_nothrow_copy_assignable
(C++11)(C++11)(C++11)

Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <type_traits>
template< class T >
struct is_copy_assignable;
(1) (начиная с C++11)
template< class T >
struct is_trivially_copy_assignable;
(2) (начиная с C++11)
template< class T >
struct is_nothrow_copy_assignable;
(3) (начиная с C++11)
1) Если T не является типом, на который можно ссылаться (т.е., возможно, cv-квалифицированным void или функциональным типом с последовательностью cv-квалификаторов или ссылочным квалификатором), предоставляет константу-элемент value, равную false. Иначе предоставляет константу-элемент value, равную std::is_assignable<T&, const T&>::value.
2) То же, что и (1), но использует std::is_trivially_assignable<T&, const T&>
3) То же, что и (1), но использует std::is_nothrow_assignable<T&, const T&>

T должен быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.

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

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

Содержание

[править] Вспомогательные шаблонные переменные

template< class T >
inline constexpr bool is_copy_assignable_v = is_copy_assignable<T>::value;
(начиная с C++17)
template< class T >
inline constexpr bool is_trivially_copy_assignable_v = is_trivially_copy_assignable<T>::value;
(начиная с C++17)
template< class T >
inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<T>::value;
(начиная с C++17)

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

Константы элементы

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

Функции-элементы

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

Типы элементы

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

[править] Возможная реализация

template< class T>
struct is_copy_assignable
    : std::is_assignable< typename std::add_lvalue_reference<T>::type,
                          typename std::add_lvalue_reference<const T>::type> {};
 
template< class T>
struct is_trivially_copy_assignable
    : std::is_trivially_assignable< typename std::add_lvalue_reference<T>::type,
                                    typename std::add_lvalue_reference<const T>::type> {};
 
template< class T>
struct is_nothrow_copy_assignable
    : std::is_nothrow_assignable< typename std::add_lvalue_reference<T>::type,
                                  typename std::add_lvalue_reference<const T>::type> {};

[править] Примечание

Свойство типа std::is_copy_assignable менее строго, чем концепт CopyAssignable, так как оно не проверяет тип результата присваивания (который для CopyAssignable типов должен быть левосторонним типом T) и не проверяет семантическое требование, чтобы выражение аргумента оставалось неизменным. Оно также не проверяет, что T соответствует MoveAssignable, что требуется для всех типов CopyAssignable.

[править] Пример

#include <iostream>
#include <utility>
#include <type_traits>
struct Foo { int n; };
int main() {
    std::cout << std::boolalpha
              << "Foo тривиально копируется с помощью присваивания? "
              << std::is_trivially_copy_assignable<Foo>::value << '\n'
              << "int[2] копируется с помощью присваивания? "
              << std::is_copy_assignable<int[2]>::value << '\n'
              << "int копируется без исключений с помощью присваивания? "
              << std::is_nothrow_copy_assignable<int>::value << '\n';
}

Вывод:

Foo тривиально копируется с помощью присваивания? true
int[2] копируется с помощью присваивания? false
int копируется без исключений с помощью присваивания? true

[править] Смотрите также

проверяет, есть ли у типа оператор присваивания для определённого аргумента
(шаблон класса) [править]
проверяет, есть ли у типа оператор присваивания перемещением
(шаблон класса) [править]