Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::tuple::tuple(3)	      C++ Standard Libary	  std::tuple::tuple(3)

NAME
       std::tuple::tuple - std::tuple::tuple

Synopsis
	  Defined in header <tuple>
	  constexpr  tuple();					   (1)	(since
       C++11)
								      (condi-
       tionally	explicit)
								      (since
       C++11)
	  tuple( const Types&... args );			 (2)   (const-
       expr since C++14)
								      (condi-
       tionally	explicit)
	  template<  class...  UTypes >					(since
       C++11)
	  tuple( UTypes&&... args );				 (3)   (const-
       expr since C++14)
								      (condi-
       tionally	explicit)
	  template<  class...  UTypes >				   (4)	(since
       C++23)
	  constexpr tuple( tuple<UTypes...>& other );		       (condi-
       tionally	explicit)
	  template<  class...  UTypes >					(since
       C++11)
	  tuple( const tuple<UTypes...>& other );		 (5)   (const-
       expr since C++14)
								      (condi-
       tionally	explicit)
	  template<  class...  UTypes >					(since
       C++11)
	  tuple( tuple<UTypes...>&& other );			 (6)   (const-
       expr since C++14)
								      (condi-
       tionally	explicit)
	  template<  class...  UTypes >				   (7)	(since
       C++23)
	  constexpr tuple( const tuple<UTypes...>&& other );	       (condi-
       tionally	explicit)
	  template<  class  U1,	class U2 >			   (8)	(since
       C++23)
	  constexpr tuple( std::pair<U1, U2>& p	);		       (condi-
       tionally	explicit)
	  template<  class  U1,	class U2 >				(since
       C++11)
	  tuple( const std::pair<U1, U2>& p );			 (9)   (const-
       expr since C++14)
								      (condi-
       tionally	explicit)
	  template<  class  U1,	class U2 >				(since
       C++11)
	  tuple( std::pair<U1, U2>&& p );			 (10)  (const-
       expr since C++14)
								      (condi-
       tionally	explicit)
	  template<  class  U1,	class U2 >			   (11)	(since
       C++23)
	  constexpr tuple( const std::pair<U1, U2>&& p );	       (condi-
       tionally	explicit)
	  template<  tuple-like	 UTuple	>			   (12)	(since
       C++23)
	  constexpr tuple( UTuple&& u );			       (condi-
       tionally	explicit)
	  tuple(  const	 tuple&	other )	= default;		   (13)	(since
       C++11)
	  tuple( tuple&& other ) = default;			  (14)	(since
       C++11)
	  Allocator-extended constructors
	  template<  class  Alloc >					(since
       C++11)
	  tuple( std::allocator_arg_t, const Alloc& a );	 (15)  (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
	  template< class Alloc	>
								      (since
       C++11)
	  tuple(  std::allocator_arg_t,	const Alloc& a,		  (16) (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
		 const Types&... args );
	  template< class Alloc, class... UTypes >
								      (since
       C++11)
	  tuple( std::allocator_arg_t, const Alloc& a,		 (17)  (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
		 UTypes&&... args );
	  template< class Alloc, class... UTypes >
								      (since
       C++23)
	  constexpr  tuple( std::allocator_arg_t, const	Alloc& a, (18) (condi-
       tionally	explicit)

			   tuple<UTypes...>& other );
	  template< class Alloc, class... UTypes >
								      (since
       C++11)
	  tuple( std::allocator_arg_t, const Alloc& a,		 (19)  (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
		 const tuple<UTypes...>& other );
	  template< class Alloc, class... UTypes >
								      (since
       C++11)
	  tuple(  std::allocator_arg_t,	const Alloc& a,		  (20) (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
		 tuple<UTypes...>&& other );
	  template< class Alloc, class... UTypes >
								      (since
       C++23)
	  constexpr tuple( std::allocator_arg_t, const Alloc& a, (21)  (condi-
       tionally	explicit)

			   const tuple<UTypes...>&& other );
	  template< class Alloc, class U1, class U2 >
								      (since
       C++23)
	  constexpr  tuple( std::allocator_arg_t, const	Alloc& a, (22) (condi-
       tionally	explicit)

			   std::pair<U1, U2>& p	);
	  template< class Alloc, class U1, class U2 >
								      (since
       C++11)
	  tuple( std::allocator_arg_t, const Alloc& a,		 (23)  (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
		 const std::pair<U1, U2>& p );
	  template< class Alloc, class U1, class U2 >
								      (since
       C++11)
	  tuple(  std::allocator_arg_t,	const Alloc& a,		  (24) (const-
       expr since C++20)
								      (condi-
       tionally	explicit)
		 std::pair<U1, U2>&& p );
	  template< class Alloc, class U1, class U2 >
								      (since
       C++23)
	  constexpr tuple( std::allocator_arg_t, const Alloc& a, (25)  (condi-
       tionally	explicit)

			   const std::pair<U1, U2>&& p );
	  template<  class  Alloc, tuple-like UTuple >			(since
       C++23)
	  constexpr tuple( std::allocator_arg_t, const Alloc& a, (26)  (condi-
       tionally	explicit)
	  UTuple&& u );
	  template< class Alloc	>
								      (since
       C++11)
	  tuple(  std::allocator_arg_t,	const Alloc& a,		  (27) (const-
       expr since C++20)

		 const tuple& other );
	  template< class Alloc	>
								      (since
       C++11)
	  tuple( std::allocator_arg_t, const Alloc& a,		 (28)  (const-
       expr since C++20)

		 tuple&& other );

	  Constructs a new tuple.

	  In the descriptions that follow, let

	    * i	be in the range	[0, sizeof...(Types)) in order,
	    * Ti be the	ith type in Types, and
	    * Ui be the	ith type in a template parameter pack named UTypes,

	  where	indexing is zero-based.

	  1)  Default constructor. Value-initializes all elements, if any. The
       default
	  constructor is trivial if sizeof...(Types) ==	0.
	    * This overload participates in overload resolution	only if
	      std::is_default_constructible<Ti>::value is true for all i.
	    * The constructor is explicit if and only if Ti is not  copy-list-
       initializable
	      from {} for at least one i.
	  2)  Direct  constructor.  Initializes	each element of	the tuple with
       the corresponding
	  parameter.
	    * This  overload  participates  in	overload  resolution  only  if
       sizeof...(Types)	>= 1
	      and std::is_copy_constructible<Ti>::value	is true	for all	i.
	    *  This  constructor  is  explicit if and only if std::is_convert-
       ible<const Ti&,
	      Ti>::value is false for at least one i.
	  3) Converting	constructor. Initializes each  element	of  the	 tuple
       with the
	  corresponding	value in std::forward<UTypes>(args).
	    * This overload participates in overload resolution	only if
		 * sizeof...(Types) == sizeof...(UTypes),
		 * sizeof...(Types) >= 1,
		 * std::is_constructible<Ti, Ui>::value	is true	for all	i, and
		 * let D be
		   std::decay<U0>::type
		   (until C++20)
		   std::remove_cvref_t<U0>
		   (since C++20),
		      *	 if  sizeof...(Types)  == 1, then D is not std::tuple,
       otherwise,
		      *	if sizeof...(Types) == 2  or  sizeof...(Types)	==  3,
       then either D is
			not   std::allocator_arg_t,   or  T0  is  std::alloca-
       tor_arg_t.
	    * The constructor is explicit  if  and  only  if  std::is_convert-
       ible<Ui,	Ti>::value is
	      false for	at least one i.

	    * This constructor is defined as deleted if	the initialization of
	      any  element  that  is  a	reference would	bind it	to a temporary
       (since C++23)
	      object.

	  4-7) Converting constructor. Initializes each	element	of  the	 tuple
       with the
	  corresponding	element	of other.

	  Formally,  let  FWD(other)  be std::forward<decltype(other)>(other),
       for all i,
	  initializes ith element of the tuple with std::get<i>(FWD(other)).

	    * This overload participates in overload resolution	only if
		 * sizeof...(Types) == sizeof...(UTypes),
		 *		 std::is_constructible_v<Ti,		   de-
       cltype(std::get<i>(FWD(other)))>	is true	for
		   all i, and
		 * either
		      *	sizeof...(Types) is not	1, or
		      *	 (when	Types... expands to T and UTypes... expands to
       U)
			std::is_convertible_v<decltype(other),		   T>,
       std::is_constructible_v<T,
			decltype(other)>,  and	std::is_same_v<T,  U>  are all
       false.
	    * These constructors are explicit if and only if
	      std::is_convertible_v<decltype(std::get<i>(FWD(other))), Ti>  is
       false for at
	      least one	i.

	    *  These constructors are defined as deleted if the	initialization
       of
	      any element that is a reference would bind  it  to  a  temporary
       (since C++23)
	      object.

	  8-11)	 Pair constructor. Constructs a	2-element tuple	with each ele-
       ment constructed
	  from the corresponding element of p.

	  Formally, let	FWD(p)	be  std::forward<decltype(p)>(p),  initializes
       the first element
	  with	  std::get<0>(FWD(p))	 and	the    second	element	  with
       std::get<1>(FWD(p)).

	    * This overload participates in overload resolution	only if
		 * sizeof...(Types) == 2,
		 * std::is_constructible_v<T0,	decltype(std::get<0>(FWD(p)))>
       is true,	and
		 *  std::is_constructible_v<T1,	decltype(std::get<1>(FWD(p)))>
       is true.
	    * The constructor is explicit if and only if
	      std::is_convertible_v<decltype(std::get<0>(FWD(p))), T0> or
	      std::is_convertible_v<decltype(std::get<1>(FWD(p))),   T1>    is
       false.

	    *  These constructors are defined as deleted if the	initialization
       of
	      any element that is a reference would bind  it  to  a  temporary
       (since C++23)
	      object.

	  12)  tuple-like  constructor.	 Constructs  a tuple with each element
       constructed from
	  the corresponding element of u.

	  Formally, for	all i, initializes ith element of the tuple with
	  std::get<i>(std::forward<UTuple>(u)).

	    * This overload participates in overload resolution	only if
		 *  std::same_as<std::remove_cvref_t<UTuple>,  std::tuple>  is
       false,
		 * std::remove_cvref_t<UTuple> is not a	specialization of
		   std::ranges::subrange,
		 *    sizeof...(Types)	  equals    std::tuple_size_v<std::re-
       move_cvref_t<UTuple>>,
		 * std::is_constructible_v<Ti,	decltype(std::get<i>(std::for-
       ward<UTuple>(u)))>
		   is true for all i, and
		 * either
		      *	sizeof...(Types) is not	1, or
		      *	  (when	  Types...   expands  to  T)  std::is_convert-
       ible_v<UTuple, T> and
			std::is_constructible_v<T, UTuple> are both false.
	    * This constructor is defined as deleted if	the initialization  of
       any element that
	      is a reference would bind	it to a	temporary object.
	  13) Implicitly-defined copy constructor. Initializes each element of
       the tuple with
	  the corresponding element of other.
	    *  This constructor	is constexpr if	every operation	it performs is
       constexpr. For
	      the empty	tuple std::tuple<>, it is constexpr.
	    * std::is_copy_constructible<Ti>::value must be true  for  all  i,
       otherwise
	      the behavior is undefined
	      (until C++20)
	      the program is ill-formed
	      (since C++20).
	  14)  Implicitly-defined move constructor. For	all i, initializes the
       ith element of
	  the tuple with std::forward<Ui>(std::get<i>(other)).
	    * This constructor is constexpr if every operation it performs  is
       constexpr. For
	      the empty	tuple std::tuple<>, it is constexpr.
	    *  std::is_move_constructible<Ti>::value  must  be true for	all i,
       otherwise
	      the behavior is undefined
	      (until C++20)
	      this overload does not participate in overload resolution
	      (since C++20).
	  15-28) Identical to (1-14) except each element is created  by	 uses-
       allocator
	  construction,	 that is, the Allocator	object a is passed as an addi-
       tional argument to
	  the constructor of each element  for	which  std::uses_allocator<Ui,
       Alloc>::value is
	  true.

Parameters
	  args	- values used to initialize each element of the	tuple
	  other	 -  the	tuple of values	used to	initialize each	element	of the
       tuple
	  p	- the pair of values used to initialize	both elements  of  the
       2-tuple
	  u	- the tuple-like object	of values used to initialize each ele-
       ment of the tuple
	  a	- the allocator	to use in uses-allocator construction

Notes
	  Conditionally-explicit  constructors make it possible	to construct a
       tuple in
	  copy-initialization context using list-initialization	syntax:

	std::tuple<int,	int> foo_tuple()
	{
	    // return {1, -1};		   // Error before N4387
	    return std::make_tuple(1, -1); // Always works
	}

	  Note that if some element of the list	is not implicitly  convertible
       to the
	  corresponding	 element  of the target	tuple, the constructors	become
       explicit:

	using namespace	std::chrono;
	void launch_rocket_at(std::tuple<hours,	minutes, seconds>);

	launch_rocket_at({hours(1), minutes(2),	seconds(3)}); // OK
	launch_rocket_at({1, 2,	3}); //	Error: int is not implicitly  convert-
       ible to duration
	launch_rocket_at(std::tuple<hours, minutes, seconds>{1,	2, 3});	// OK

Example
       // Run this code

	#include <iomanip>
	#include <iostream>
	#include <memory>
	#include <string>
	#include <string_view>
	#include <tuple>
	#include <type_traits>
	#include <vector>

	// helper function to print a vector to	a stream
	template<class Os, class T>
	Os& operator<<(Os& os, std::vector<T> const& v)
	{
	    os << '{';
	    for	(auto i{v.size()}; const T& e :	v)
		os << e	<< (--i	? "," :	"");
	    return os << '}';
	}

	template<class T>
	void print_single(T const& v)
	{
	    if constexpr (std::is_same_v<T, std::decay_t<std::string>>)
		std::cout << std::quoted(v);
	    else if constexpr (std::is_same_v<std::decay_t<T>, char>)
		std::cout << "'" << v << "'";
	    else
		std::cout << v;
	}

	// helper function to print a tuple of any size
	template<class Tuple, std::size_t N>
	struct TuplePrinter
	{
	    static void	print(const Tuple& t)
	    {
		TuplePrinter<Tuple, N -	1>::print(t);
		std::cout << ",	";
		print_single(std::get<N	- 1>(t));
	    }
	};

	template<class Tuple>
	struct TuplePrinter<Tuple, 1>
	{
	    static void	print(const Tuple& t)
	    {
		print_single(std::get<0>(t));
	    }
	};

	template<class... Args>
	void print(std::string_view message, const std::tuple<Args...>&	t)
	{
	    std::cout << message << " (";
	    TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
	    std::cout << ")\n";
	}
	// end helper function

	int main()
	{
	    std::tuple<int, std::string, double> t1;
	    print("Value-initialized, t1:", t1);

	    std::tuple<int, std::string, double> t2{42,	"Test",	-3.14};
	    print("Initialized with values, t2:", t2);

	    std::tuple<char, std::string, int> t3{t2};
	    print("Implicitly converted, t3:", t3);

	    std::tuple<int, double> t4{std::make_pair(42, 3.14)};
	    print("Constructed from a pair, t4:", t4);

	    // given Allocator my_alloc	with a single-argument constructor
	    // my_alloc(int); use my_alloc(1) to allocate 5 ints in a vector
	    using my_alloc = std::allocator<int>;
	    std::vector<int, my_alloc> v{5, 1, my_alloc{/* 1 */}};

	    // use my_alloc(2) to allocate 5 ints in a vector in a tuple
	    std::tuple<int, std::vector<int, my_alloc>,	double>	t5
		{std::allocator_arg, my_alloc{/* 2 */},	42, v, -3.14};
	    print("Constructed with allocator, t5:", t5);
	}

Possible output:
	Value-initialized, t1: (0, "", 0)
	Initialized with values, t2: (42, "Test", -3.14)
	Implicitly converted, t3: ('*',	"Test",	-3)
	Constructed from a pair, t4: (42, 3.14)
	Constructed with allocator, t5:	(42, {1,1,1,1,1}, -3.14)

	  Defect reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	     DR	    Applied  to	       Behavior	as published		  Cor-
       rect behavior
	  LWG 2510 C++11      default constructor was implicit	   made	condi-
       tionally-explicit
			      constructor of 1-tuple might
	  LWG 3121 C++11      recursively check	the  constraints;    furtherly
       constrained
			      allocator_arg_t  argument	 brought      the con-
       structor
			      ambiguity
			      the uses-allocator constructor
	  LWG 3158 C++11      corresponding			   made	condi-
       tionally-explicit
			      to default constructor was implicit
	  LWG 3211 C++11      whether the default constructor of   require  to
       be trivial
			      tuple<> is trivial was unspecified
	  N4387	    C++11	some constructors were explicit,     most con-
       structors made
			      preventing useful	behavior	    condition-
       ally-explicit
			      tuple-like constructor may
	  LWG  4045  C++23	 potentially create dangling	      made de-
       fined as	deleted
			      references

See also
	  operator=	   assigns the contents	of one tuple to	another
			   (public member function)
	  make_tuple	   creates a tuple object of the type defined  by  the
       argument	types
	  (C++11)	   (function template)
	  tie		    creates  a tuple of	lvalue references or unpacks a
       tuple into
	  (C++11)	   individual objects
			   (function template)
	  forward_as_tuple creates a tuple of forwarding references
	  (C++11)	   (function template)
	  constructor	   constructs new pair
			   (public member function of std::pair<T1,T2>)

http://cppreference.com		  2024.06.10		  std::tuple::tuple(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::tuple::tuple&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help