std::is_constructible, std::is_trivially_constructible, std::is_nothrow_constructible
Материал из cppreference.com
Определено в заголовочном файле <type_traits>
|
||
template< class T, class... Args > struct is_constructible; |
(1) | (начиная с C++11) |
template< class T, class... Args > struct is_trivially_constructible; |
(2) | (начиная с C++11) |
template< class T, class... Args > struct is_nothrow_constructible; |
(3) | (начиная с C++11) |
1) Если
Для целей этой проверки определение переменной никогда не интерпретируется как объявление функции, а использование std::declval не считается использованием odr. Проверки доступа выполняются так, как будто из контекста, не связанного с
T
является объектом или ссылочным типом и определение переменной T obj(std::decclval<Args>()...); правильно сформировано, обеспечивает константу элемент value
равную true. Во всех остальных случаях value
равна false.Для целей этой проверки определение переменной никогда не интерпретируется как объявление функции, а использование std::declval не считается использованием odr. Проверки доступа выполняются так, как будто из контекста, не связанного с
T
и любым из типов в Args
. Учитывается только правильность непосредственного контекста определения переменной.2) То же, что и (1), но определение переменной не вызывает никаких нетривиальных операций. Для целей этой проверки вызов std::declval считается тривиальным.
3) То же, что и (1), но определение переменной является
noexcept
.T
и все типы в пакете параметров Args
должен каждый быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Содержание |
[править] Вспомогательная шаблонная переменная
template< class T, class... Args > inline constexpr bool is_constructible_v = is_constructible<T, Args...>::value; |
(начиная с C++17) | |
template< class T, class... Args > inline constexpr bool is_trivially_constructible_v = is_trivially_constructible<T, Args...>::value; |
(начиная с C++17) | |
template< class T, class... Args > inline constexpr bool is_nothrow_constructible_v = is_nothrow_constructible<T, Args...>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] |
true, если T конструируется из Args... , false иначе (public static константа-элемент) |
Функции-элементы
operator bool |
преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
Тип | Определение |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[править] Примечание
Во многих реализациях is_nothrow_constructible
также проверяет вызывает ли исключения деструктор, потому что фактически это noexept(T(arg)). То же самое относится к is_trivially_constructible
, которое, в этих реализациях требует, чтобы и деструктор был тривиальным: Ошибка GCC 51452 LWG проблема 2116.
[править] Пример
Запустить этот код
#include <iostream> #include <type_traits> class Foo { int v1; double v2; public: Foo(int n) : v1(n), v2() {} Foo(int n, double f) noexcept : v1(n), v2(f) {} }; int main() { auto is = [](bool o) { return (o ? "\t" : "\t" "не "); }; std::cout << "Foo ...\n" << is(std::is_trivially_constructible_v<Foo, const Foo&>) << "Тривиально конструируется из const Foo&\n" << is(std::is_trivially_constructible_v<Foo, int>) << "Тривиально конструируется из int\n" << is(std::is_constructible_v<Foo, int>) << "Конструируется из int\n" << is(std::is_nothrow_constructible_v<Foo, int>) << "Конструируется без исключений из int\n" << is(std::is_nothrow_constructible_v<Foo, int, double>) << "Конструируется без исключений из int и double\n"; }
Вывод:
Foo ... Тривиально конструируется из const Foo& не Тривиально конструируется из int Конструируется из int не Конструируется без исключений из int Конструируется без исключений из int и double
[править] Смотрите также
проверяет, есть ли у типа конструктор по умолчанию (шаблон класса) | |
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа конструктор копирования (шаблон класса) |
(C++11)(C++11)(C++11) |
проверяет, может ли тип быть сконструирован из правосторонней ссылки (шаблон класса) |
(C++20) |
указывает, что переменная типа может быть создана из набора или привязана к типам аргументов (концепт) |