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

FreeBSD Manual Pages

  
 
  

home | help
std::experi...::construct(3)  C++ Standard Libary std::experi...::construct(3)

NAME
       std::experimental::pmr::polymorphic_allocator::construct	- std::experi-
       mental::pmr::polymorphic_allocator::construct

Synopsis
	  template<  class U, class... Args >			  (1) (library
       fundamentals TS)
	  void construct( U* p,	Args&&... args );
	  template< class T1, class T2,	class... Args1,	class...
	  Args2	>

	  void construct( std::pair<T1,	T2>* p,			 (2)  (library
       fundamentals TS)
			  std::piecewise_construct_t,
			  std::tuple<Args1...> x,

			  std::tuple<Args2...> y );
	  template<  class T1, class T2	>			  (3) (library
       fundamentals TS)
	  void construct( std::pair<T1,	T2>* p );
	  template< class T1, class T2,	class U, class V >	 (4)  (library
       fundamentals TS)
	  void construct( std::pair<T1,	T2>* p,	U&& x, V&& y );
	  template< class T1, class T2,	class U, class V >
	  void	construct( std::pair<T1, T2>* p, const		  (5) (library
       fundamentals TS)
	  std::pair<U, V>& xy );
	  template< class T1, class T2,	class U, class V >
	  void construct( std::pair<T1,	T2>* p,	std::pair<U,	 (6)  (library
       fundamentals TS)
	  V>&& xy );

	  Constructs  an  object  in  allocated,  but  not initialized storage
       pointed to by p the
	  provided constructor arguments. If the object	is of type that	itself
       uses
	  allocators, or if it is std::pair, passes this->resource()  down  to
       the constructed
	  object.

	  1)  If std::uses_allocator<U,	memory_resource*>::value == false (the
       type U does not
	  use  allocators)  and	 std::is_constructible<U,  Args...>::value  ==
       true, then
	  constructs  the  object  as  if  by  ::new((void  *)	p) U(std::for-
       ward<Args>(args)...);.

	  Otherwise,  if  std::uses_allocator<U,  memory_resource*>::value  ==
       true (the type U
	  uses	 allocators,   e.g.   it  is  a	 container)  and  std::is_con-
       structible<U,
	  std::allocator_arg_t,	 memory_resource*,  Args...>::value  ==	 true,
       then constructs the
	  object  as  if  by ::new((void *) p) U(std::allocator_arg, this->re-
       source(),
	  std::forward<Args>(args)...);.

	  Otherwise,  if  std::uses_allocator<U,  memory_resource*>::value  ==
       true (the type U
	  uses	 allocators,   e.g.   it  is  a	 container)  and  std::is_con-
       structible<U, Args...,
	  memory_resource*>::value == true, then constructs the	object	as  if
       by ::new((void *)
	  p) U(std::forward<Args>(args)..., this->resource());.

	  Otherwise, the program is ill-formed.

	  2) First, if either T1 or T2 is allocator-aware, modifies the	tuples
       x and y to
	  include this->resource(), resulting in the two new tuples xprime and
       yprime,
	  according to the following three rules:

	  2a) if T1 is not allocator-aware (std::uses_allocator<T1, memory_re-
       source*>::value
	  ==  false)  and  std::is_constructible<T1, Args1...>::value == true,
       then xprime is x,
	  unmodified.

	  2b) if T1  is	 allocator-aware  (std::uses_allocator<T1,  memory_re-
       source*>::value ==
	  true),  and  its  constructor	 takes	an allocator tag (std::is_con-
       structible<T1,
	  std::allocator_arg_t,	memory_resource*,  Args1...>::value  ==	 true,
       then xprime is
	  std::tuple_cat(std::make_tuple(std::allocator_arg,	     this->re-
       source()), std::move(x)).

	  2c) if T1  is	 allocator-aware  (std::uses_allocator<T1,  memory_re-
       source*>::value ==
	  true), and its constructor takes the allocator as the	last argument
	  (std::is_constructible<T1,   Args1...,  memory_resource*>::value  ==
       true), then xprime
	  is std::tuple_cat(std::move(x), std::make_tuple(this->resource())).

	  2d) Otherwise, the program is	ill-formed.

	  Same rules apply to T2 and the replacement of	y with yprime.

	  Once xprime and yprime are constructed, constructs the pair p	in al-
       located storage
	  as if	by ::new((void *)  p)  pair<T1,	 T2>(std::piecewise_construct,
       std::move(xprime),
	  std::move(yprime));.

	  3)  Equivalent  to  construct(p,  std::piecewise_construct, std::tu-
       ple<>(),
	  std::tuple<>()), that	is, passes  the	 memory	 resource  on  to  the
       pair's member types
	  if they accept them.

	  4) Equivalent	to

	  construct(p,	    std::piecewise_construct,	   std::forward_as_tu-
       ple(std::forward<U>(x)),
						 std::forward_as_tu-
       ple(std::forward<V>(y)))

	  5) Equivalent	to

	  construct(p,	    std::piecewise_construct,	   std::forward_as_tu-
       ple(xy.first),
						 std::forward_as_tuple(xy.sec-
       ond))

	  6) Equivalent	to

	  construct(p, std::piecewise_construct,
	  std::forward_as_tuple(std::forward<U>(xy.first)),

	   std::forward_as_tuple(std::forward<V>(xy.second)))

Parameters
	  p	  - pointer to allocated, but not initialized storage
	  args... - the	constructor arguments to pass to the constructor of T
	  x	  - the	constructor arguments to pass to the constructor of T1
	  y	  - the	constructor arguments to pass to the constructor of T2
	  xy	   -  the pair whose two members are the constructor arguments
       for T1 and T2

Return value
	  (none)

Notes
	  This function	is called (through std::allocator_traits) by any allo-
       cator-aware
	  object, such as std::vector, that was	given a	std::polymorphic_allo-
       cator as	the
	  allocator to use. Since memory_resource* implicitly converts to
	  polymorphic_allocator, the memory resource pointer will propagate to
       any
	  allocator-aware subobjects using polymorphic allocators.

See also
	  construct	constructs an object in	the allocated storage
	  [static]	(function template)
	  construct	constructs an object in	allocated storage
	  (until C++20)	(public	member function	of std::allocator<T>)

Category:
	    * Noindexed	pages

http://cppreference.com		  2024.06.10	  std::experi...::construct(3)

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

home | help