Namespaces
Variants

std:: is_copy_constructible, std:: is_trivially_copy_constructible, std:: is_nothrow_copy_constructible

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Определено в заголовочном файле <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 =

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 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 в этом случае

Смотрите также

проверяет, имеет ли тип конструктор для определенных аргументов
(шаблон класса)
проверяет, имеет ли тип конструктор по умолчанию
(шаблон класса)
проверяет, может ли тип быть сконструирован из rvalue-ссылки
(шаблон класса)
указывает, что объект типа может быть скопирован и перемещен
(концепт)