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) |
| Типовой признак |
Значение константы-члена
value
|
|
|---|---|---|
T
является
ссылочным типом
|
T
не является ссылочным типом
|
|
| (1) | std:: is_constructible < T, const T & > :: value | false |
| (2) | std:: is_trivially_constructible < T, const T & > :: value | |
| (3) | std:: is_nothrow_constructible < T, const T & > :: value | |
Если
T
не является полным типом, (возможно, с cv-квалификаторами)
void
, или массивом неизвестной границы, поведение не определено.
Если создание экземпляра шаблона выше зависит, прямо или косвенно, от неполного типа, и это создание экземпляра может дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.
Если программа добавляет специализации для любых шаблонов, описанных на этой странице, поведение не определено.
Содержание |
Вспомогательные шаблоны переменных
|
template
<
class
T
>
inline
constexpr
bool
is_copy_constructible_v
=
|
(начиная с C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_trivially_copy_constructible_v
=
|
(начиная с C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_nothrow_copy_constructible_v
=
|
(начиная с 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 bug 51452
,
LWG issue 2116
.
Пример
#include <string> #include <type_traits> struct S1 { std::string str; // член имеет нетривиальный конструктор копирования }; static_assert(std::is_copy_constructible_v<S1>); static_assert(!std::is_trivially_copy_constructible_v<S1>); struct S2 { int n; S2(const S2&) = default; // тривиальный и не выбрасывающий исключения }; static_assert(std::is_trivially_copy_constructible_v<S2>); static_assert(std::is_nothrow_copy_constructible_v<S2>); struct S3 { S3(const S3&) = delete; // явно удален }; static_assert(!std::is_copy_constructible_v<S3>); struct S4 { S4(S4&) {}; // не может связывать const, следовательно не является копируемым }; static_assert(!std::is_copy_constructible_v<S4>); int main() {}
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2196 | C++11 | поведение было неясным, если const T & не может быть сформирован | производимое значение равно false в этом случае |
Смотрите также
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип конструктор для определенных аргументов
(шаблон класса) |
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип конструктор по умолчанию
(шаблон класса) |
|
(C++11)
(C++11)
(C++11)
|
проверяет, может ли тип быть сконструирован из rvalue-ссылки
(шаблон класса) |
|
(C++20)
|
указывает, что объект типа может быть скопирован и перемещен
(концепт) |