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-qualifier-seq или ref-qualifier), предоставляет статическую константу-член value равную false. В противном случае, предоставляет статическую константу-член value равную std::is_constructible<T, const T&>::value.
T должен быть полным типом, (возможно cv-квалифицированным) void или массивом неизвестной длины. В противном случае, поведение не определено.
Если экземпляр шаблона выше зависит, прямо или косвенно, от неполного типа, и этот экземпляр мог бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Поведение программы, добавляющей специализации для любого из описанных на этой странице шаблонов, не определено.
Вспомогательные шаблоны переменных
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 в противном случае (публичная статическая константа-член) |
Члены-функции
| operator bool |
преобразует объект в bool, возвращает value (публичная член-функция) |
| operator()
(C++14) |
возвращает value (публичная член-функция) |
Типы-члены
| Тип | Определение |
|---|---|
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; // member has a non-trivial copy ctor
};
struct Ex2
{
int n;
Ex2(const Ex2&) = default; // trivial and non-throwing
};
int main()
{
std::cout << std::boolalpha << "Ex1 is copy-constructible? "
<< std::is_copy_constructible<Ex1>::value << '\n'
<< "Ex1 is trivially copy-constructible? "
<< std::is_trivially_copy_constructible<Ex1>::value << '\n'
<< "Ex2 is trivially copy-constructible? "
<< std::is_trivially_copy_constructible<Ex2>::value << '\n'
<< "Ex2 is nothrow copy-constructible? "
<< std::is_nothrow_copy_constructible<Ex2>::value << '\n';
}Вывод:
Ex1 is copy-constructible? true Ex1 is trivially copy-constructible? false Ex2 is trivially copy-constructible? true Ex2 is nothrow copy-constructible? true
См. также
|
(C++11)(C++11)(C++11) |
проверяет, имеет ли тип конструктор для определённых аргументов (шаблон класса) |
|
(C++11)(C++11)(C++11) |
проверяет, имеет ли тип конструктор по умолчанию (шаблон класса) |
|
(C++11)(C++11)(C++11) |
проверяет, может ли тип быть создан из ссылки на rvalue (шаблон класса) |
|
(C++20) |
определяет, что объект типа может быть скопирован и перемещён (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_copy_constructible