Spec-Zone.ru › C++

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)
1) Если T является типом объекта или ссылочным типом и определение переменной T obj(std::declval<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
(открытая статическая константа-член)

Функции-члены

operator bool
преобразует объект в bool, возвращает value
(открытая функция-член)
operator()
(C++14)
возвращает value
(открытая функция-член)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool,value>

Примечания

Во многих реализациях is_nothrow_constructible также проверяет, не выбрасывает ли деструктор исключение, поскольку по сути это noexcept(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" "is " : "\t" "isn't "); };
    std::cout << "Foo ...\n"
              << is(std::is_trivially_constructible_v<Foo, const Foo&>)
              << "Trivially-constructible from const Foo&\n"
              << is(std::is_trivially_constructible_v<Foo, int>)
              << "Trivially-constructible from int\n"
              << is(std::is_constructible_v<Foo, int>)
              << "Constructible from int\n"
              << is(std::is_nothrow_constructible_v<Foo, int>)
              << "Nothrow-constructible from int\n"
              << is(std::is_nothrow_constructible_v<Foo, int, double>)
              << "Nothrow-constructible from int and double\n";
}

Вывод:

Foo ...
        is Trivially-constructible from const Foo&
        isn't Trivially-constructible from int
        is Constructible from int
        isn't Nothrow-constructible from int
        is Nothrow-constructible from int and double

См. также

is_default_constructibleis_trivially_default_constructibleis_nothrow_default_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор по умолчанию
(шаблон класса)
is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
проверяет, есть ли у типа конструктор копирования
(шаблон класса)
is_move_constructibleis_trivially_move_constructibleis_nothrow_move_constructible
(C++11)(C++11)(C++11)
проверяет, можно ли сконструировать тип из rvalue-ссылки
(шаблон класса)
constructible_from
(C++20)
задаёт требование, согласно которому переменная данного типа может быть сконструирована из набора типов аргументов или привязана к нему
(концепт)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_constructible

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API