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

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++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(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 >
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

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

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