Spec-Zone.ru › C++

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<classT, tuple-like Tuple,std::size_t...I>// no constraint on Tuple before C++23
constexprT/*make-from-tuple-impl*/(Tuple&&t,std::index_sequence<I...>)
{
    returnT(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>>>{});.

Если

  • std::tuple_size_v<std::remove_reference_t<Tuple>> является 1, а std::reference_constructs_from_temporary_v<T, decltype(std::get<0>(std::declval<Tuple>()))> является true, или
(начиная с C++23)
  • std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...> является false,

программа некорректна.

Параметры

t - кортеж, элементы которого используются в качестве аргументов конструктора T

Возвращаемое значение

Созданный объект или ссылка типа T.

Примечания

Tuple не обязательно должен быть std::tuple; вместо этого он может быть любым типом, поддерживающим std::get и std::tuple_size; в частности, можно использовать std::array и std::pair.

(до C++23)

Для Tuple требуется, чтобы тип был кортежеподобным, то есть каждый тип в нём должен быть специализацией std::tuple или другим типом (например, std::array и std::pair), соответствующим требованиям tuple-like.

(начиная с 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 и т. п., допускалось для кортежа из одного элемента запрещено

См. также

make_tuple
(C++11)
создаёт tuple объект типа, определяемого типами аргументов
(шаблон функции)
forward_as_tuple
(C++11)
создаёт tuple из пересылающих ссылок
(шаблон функции)
apply
(C++17)
вызывает функцию с кортежем аргументов
(шаблон функции)

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

Spec-Zone.ru

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