std::make_from_tuple
<tuple>
constexpr T make_from_tuple( Tuple&& t );
(until C++23)
constexpr T make_from_tuple( Tuple&& t );
Construct an object of type T
, using the elements of the tuple t as the arguments to the constructor.
Given the exposition-only function /*make-from-tuple-impl*/ defined as follows:
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))...);
}
The effect is equivalent to:
return /*make-from-tuple-impl*/<T>(
std::forward <Tuple>(t),
std::make_index_sequence <std::tuple_size_v <std::remove_reference_t <Tuple>>>{}
);.
If
- std::tuple_size_v <std::remove_reference_t <Tuple>> is 1 and std::reference_constructs_from_temporary_v<
T, decltype(std::get<0>(std::declval <Tuple>()))> is true, or
- std::is_constructible_v <T, decltype(std::get<I>(std::declval <Tuple>()))...> is false,
the program is ill-formed.
[edit] Parameters
T
[edit] Return value
The constructed T
object or reference.
[edit] Notes
Tuple
need not be std::tuple , and instead may be anything that supports std::get and std::tuple_size; in particular, std::array and std::pair may be used.
Tuple
is constrained to be tuple-like, i.e. each type therein is required to be a specialization of std::tuple or another type (such as std::array and std::pair ) that models tuple-like.
Due to guaranteed copy elision, T
need not be movable.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_make_from_tuple |
201606L |
(C++17) | std::make_from_tuple
|
[edit] Example
#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)); }
Output:
42, 3.14, 0
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3528 | C++17 | cast containing reinterpret_cast etc. was allowed in the case of 1-tuple | prohibited |