std::is_copy_constructible, std::is_trivially_copy_constructible, std::is_nothrow_copy_constructible
| Определено в заголовочном файле <type_traits>
|
||
template< class T > struct is_copy_constructible; |
(1) | (начиная с C++11) |
template< class T > struct is_trivially_copy_constructible; |
(2) | (начиная с C++11) |
template< class T > struct is_nothrow_copy_constructible; |
(3) | (начиная с C++11) |
T не является типом, на который можно ссылаться (т.е., возможно, cv-квалифицированным void или типом функции с последовательностью cv-квалификаторов или ссылочным квалификатором), предоставляет константу-элемент value, равную false. Иначе предоставляет константу-элемент value, равную std::is_constructible<T, const T&>::value.std::is_trivially_constructible<T, const T&>.std::is_nothrow_constructible<T, const T&>.T должен быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.
Вспомогательные шаблонные переменные
<tbody> </tbody> template< class T > inline constexpr bool is_copy_constructible_v = is_copy_constructible<T>::value; |
(начиная с C++17) | |
template< class T > inline constexpr bool is_trivially_copy_constructible_v = is_trivially_copy_constructible<T>::value; |
(начиная с C++17) | |
template< class T > inline constexpr bool is_nothrow_copy_constructible_v = is_nothrow_copy_constructible<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_constructible :
std::is_constructible<T, typename std::add_lvalue_reference<
typename std::add_const<T>::type>::type> {};
template<class T>
struct is_trivially_copy_constructible :
std::is_trivially_constructible<T, typename std::add_lvalue_reference<
typename std::add_const<T>::type>::type> {};
template<class T>
struct is_nothrow_copy_constructible :
std::is_nothrow_constructible<T, typename std::add_lvalue_reference<
typename std::add_const<T>::type>::type> {};
|
Примечание
Во многих реализациях is_nothrow_copy_constructible также проверяет вызывает ли деструктор исключение или нет, потому что фактически это noexcept(T(arg)). То же самое относится к is_trivially_copy_constructible, которое в этих реализациях также требует, чтобы деструктор был тривиальным: Ошибка GCC 51452, LWG проблема 2116.
Пример
#include <iostream>
#include <type_traits>
struct Ex1 {
std::string str; // Элемент имеет нетривиальный конструктор копирования
};
struct Ex2 {
int n;
Ex2(const Ex2&) = default; // Тривиальный и не вызывающий исключений
// конструктор копирования
};
int main() {
std::cout << std::boolalpha << "Ex1 можно скопировать? "
<< std::is_copy_constructible<Ex1>::value << '\n'
<< "Ex1 тривиально копируется? "
<< std::is_trivially_copy_constructible<Ex1>::value << '\n'
<< "Ex2 тривиально копируется? "
<< std::is_trivially_copy_constructible<Ex2>::value << '\n'
<< "Ex2 копируется без исключений? "
<< std::is_nothrow_copy_constructible<Ex2>::value << '\n';
}
Вывод:
Ex1 можно скопировать? true
Ex1 тривиально копируется? false
Ex2 тривиально копируется? true
Ex2 копируется без исключений? true
Смотрите также
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа конструктор для определённых аргументов (шаблон класса) |
| проверяет, есть ли у типа конструктор по умолчанию (шаблон класса) | |
(C++11)(C++11)(C++11) |
проверяет, может ли тип быть сконструирован из правосторонней ссылки (шаблон класса) |
(C++20) |
указывает, что объект типа может быть создан копированием и перемещением (концепт) |