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<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>>>{}
);
.

Если

  • 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++.

DR Применено к Поведение, как опубликовано Правильное поведение
LWG 3528 C++17 Разрешался reinterpret_cast и др. в случае 1-кортежа Запрещено

См. также

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

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

Spec-Zone.ru

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