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/w/cpp/types/is_constructible

Spec-Zone.ru

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