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::declval<Args>()...); является корректным, предоставляет член-константу value равную true. Во всех остальных случаях, value равно false.Для целей этой проверки, определение переменной никогда не интерпретируется как объявление функции, и использование
std::declval не считается odr-использованием. Проверки доступа выполняются так, как если бы они происходили из контекста, не связанного с T и любыми типами из Args. Учитывается только корректность непосредственного контекста определения переменной.std::declval считается тривиальным.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См. также
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип конструктор по умолчанию (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип конструктор копирования (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, может ли тип быть сконструирован из ссылки на rvalue (шаблон класса) |
|
(C++20) | задаёт, что переменная типа может быть сконструирована или связана со множеством типов аргументов (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_constructible