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::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_constructible<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_constructible<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_resource*>::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_resource*>::value==true), and its constructor takes an	 allo-
       cator tag
	  (std::is_constructible<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_resource*>::value==true), and its constructor takes the allo-
       cator as	the last
	  argument     (std::is_constructible<T1,     Args1...,	    memory_re-
       source*>::value==true), then
	  xprime   is  std::tuple_cat(std::move(x),  std::make_tuple(this->re-
       source())).

	  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_tuple(std::forward<V>(y)))

	  5) Equivalent	to

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

	  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>)

http://cppreference.com		  2022.07.31	  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.0>

home | help