std::is_constructible, std::is_trivially_constructible, std::is_nothrow_constructible
| Определено в заголовочном файле <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) |
T является объектом или ссылочным типом и определение переменной T obj(std::decclval<Args>()...); правильно сформировано, обеспечивает константу элемент value равную true. Во всех остальных случаях value равна false.Для целей этой проверки определение переменной никогда не интерпретируется как объявление функции, а использование std::declval не считается использованием odr. Проверки доступа выполняются так, как будто из контекста, не связанного с T и любым из типов в Args. Учитывается только правильность непосредственного контекста определения переменной.
noexcept.T и все типы в пакете параметров Args должен каждый быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Вспомогательная шаблонная переменная
<tbody> </tbody> 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) |
указывает, что переменная типа может быть создана из набора или привязана к типам аргументов (концепт) |