Spec-Zone.ru › C++

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

Определено в заголовке <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-qualifier-seq или ref-qualifier), предоставляет статическое константное член 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 в противном случае
(публичная статическая константа)

Члены-функции

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

Типы членов

Тип Определение
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 должен быть lvalue типа T) и не проверяет семантическое требование, что выражение аргумента остается неизменным. Она также не проверяет, что T удовлетворяет MoveAssignable, что требуется для всех типов CopyAssignable.

Пример

#include <iostream>
#include <type_traits>
#include <utility>
 
struct Foo { int n; };
 
int main()
{
    std::cout << std::boolalpha
              << "Foo is trivially copy-assignable? "
              << std::is_trivially_copy_assignable<Foo>::value << '\n'
              << "int[2] is copy-assignable? "
              << std::is_copy_assignable<int[2]>::value << '\n'
              << "int is nothrow copy-assignable? "
              << std::is_nothrow_copy_assignable<int>::value << '\n';
}

Вывод:

Foo is trivially copy-assignable? true
int[2] is copy-assignable? false
int is nothrow copy-assignable? true

См. также

is_assignableis_trivially_assignableis_nothrow_assignable
(C++11)(C++11)(C++11)
проверяет, имеет ли тип оператор присваивания для конкретного аргумента
(шаблон класса)
is_move_assignableis_trivially_move_assignableis_nothrow_move_assignable
(C++11)(C++11)(C++11)
проверяет, имеет ли тип оператор перемещающего присваивания
(шаблон класса)

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

Spec-Zone.ru

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