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> // нет ограничений на Tuple до 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++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 3528 | C++17 | приведение, содержащее reinterpret_cast и т.д., было разрешено в случае 1-кортежа
|
запрещено |
Смотрите также
(C++11) |
создаёт объект tuple типа, определённого типами аргументов (шаблон функции) |
(C++11) |
создаёт tuple пересылалаемых ссылок (шаблон функции) |
(C++17) |
вызывает функцию с кортежем аргументов (шаблон функции) |