Пространства имён
Варианты
Действия

std::is_constructible, std::is_trivially_constructible, std::is_nothrow_constructible

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <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) Если 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_typebool
typestd::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

[править]Смотрите также

проверяет, есть ли у типа конструктор по умолчанию
(шаблон класса)[править]
проверяет, есть ли у типа конструктор копирования
(шаблон класса)[править]
проверяет, может ли тип быть сконструирован из правосторонней ссылки
(шаблон класса)[править]
указывает, что переменная типа может быть создана из набора или привязана к типам аргументов
(концепт)[править]
close