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> inlineconstexprbool is_constructible_v = is_constructible<T, Args...>::value; | (начиная с C++17) | |
template<class T, class... Args> inlineconstexprbool is_trivially_constructible_v = is_trivially_constructible<T, Args...>::value; | (начиная с C++17) | |
template<class T, class... Args> inlineconstexprbool 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 51452LWG проблема 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) | указывает, что переменная типа может быть создана из набора или привязана к типам аргументов (концепт) |