Spec-Zone.ru › C++

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)
1) Если T не является типом, на который можно ссылаться (то есть, возможно, cv-квалифицированный void или тип функции с cv-спецификатором или спецификатором ссылки), предоставляет константу-член value, равную false. В противном случае предоставляет константу-член value, равную std::is_constructible<T, const T&>::value.
2) То же, что и (1), но используется std::is_trivially_constructible<T, const T&>.
3) То же, что и (1), но используется std::is_nothrow_constructible<T, const T&>.

Если 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.

std::is_copy_constructible_v может возвращать true для типов, у которых есть конструктор копирования, но вызов которого некорректен, например std::vector<std::mutex>.

Пример

#include <string>
#include <type_traits>

struct S1
{
    std::string str; // member has a non-trivial copy constructor
};
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; // trivial and non-throwing
};
static_assert(std::is_trivially_copy_constructible_v<S2>);
static_assert(std::is_nothrow_copy_constructible_v<S2>);

struct S3
{
    S3(const S3&) = delete; // explicitly deleted
};
static_assert(!std::is_copy_constructible_v<S3>);

struct S4
{
    S4(S4&) {}; // cannot bind const, hence not a copy-constructible
};
static_assert(!std::is_copy_constructible_v<S4>);

int main() {}

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Правильное поведение
LWG 2196 C++11 поведение было неясным, если нельзя сформировать constT& в этом случае результатом является false

См. также

is_constructibleis_trivially_constructibleis_nothrow_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор для заданных аргументов
(шаблон класса)
is_default_constructibleis_trivially_default_constructibleis_nothrow_default_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор по умолчанию
(шаблон класса)
is_move_constructibleis_trivially_move_constructibleis_nothrow_move_constructible
(C++11)(C++11)(C++11)
проверяет, можно ли сконструировать тип из rvalue-ссылки
(шаблон класса)
copy_constructible
(C++20)
задаёт требование, что объект типа можно сконструировать копированием и перемещением
(концепт)

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

Spec-Zone.ru

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