std::make_from_tuple
| Определён в заголовке <tuple>
|
||
template< class T, class Tuple >
constexpr T make_from_tuple( Tuple&& t );
|
(начиная с C++17) (до C++23) |
|
template< class T, tuple-like Tuple >
constexpr T make_from_tuple( Tuple&& t );
|
(начиная с C++23) | |
Создаёт объект типа T, используя элементы кортежа t в качестве аргументов конструктора.
Пусть дана иллюстративная функция /*make-from-tuple-impl*/, определённая следующим образом:
template<class T, tuple-like Tuple, std::size_t... I> // no constraint on Tuple before C++23
constexpr T /*make-from-tuple-impl*/(Tuple&& t, std::index_sequence<I...>)
{
return T(std::get<I>(std::forward<Tuple>(t))...);
}
Результат эквивалентен:return /*make-from-tuple-impl*/<T>(std::forward<Tuple>(t),std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});.
Если
|
(начиная с C++23) |
std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...>— этоfalse,
программа считается некорректной.
Параметры
| t | - |
кортеж, элементы которого будут использоваться в качестве аргументов для конструктора
T
|
Возвращаемое значение
Сконструированный
T
объект или ссылка.
Примечания
|
|
(до C++23) |
|
|
(начиная с C++23) |
Благодаря
гарантированному пропуску копирования
,
T
не обязательно должен быть перемещаемым.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_make_from_tuple
|
201606L
|
(C++17) |
std::make_from_tuple
|
Пример
#include <iostream> #include <tuple> struct Foo { Foo(int first, float second, int third) { std::cout << first << ", " << second << ", " << third << '\n'; } }; int main() { auto tuple = std::make_tuple(42, 3.14f, 0); std::make_from_tuple<Foo>(std::move(tuple)); }
Вывод:
42, 3.14, 0
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3528 | C++17 | приведение, содержащее reinterpret_cast и т.д., было разрешено в случае 1-кортежа | запрещено |
Смотрите также
|
(C++11)
|
создает объект
tuple
типа, определенного типами аргументов
(шаблон функции) |
|
(C++11)
|
создает
tuple
из
forwarding references
(шаблон функции) |
|
(C++17)
|
вызывает функцию с кортежем аргументов
(шаблон функции) |