std:: uses_allocator_construction_args
| 
           
           Defined in header
            
         
            
             <memory>
            
           
           | 
         ||
          
            T
           
           is not a specialization of
           
            
             std::pair
            
           
           | 
         ||
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            ...
            
             Args
            
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (1) | (since C++20) | 
          
            T
           
           is a specialization of
           
            
             std::pair
            
           
           | 
         ||
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            Tuple1,
            
             class
            
            Tuple2
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (2) | (since C++20) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc
            
             >
            
             
         constexpr auto uses_allocator_construction_args ( const Alloc & alloc ) noexcept ;  | 
         (3) | (since C++20) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (4) | (since C++20) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (5) | (since C++23) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (6) | (since C++20) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (7) | (since C++20) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (8) | (since C++23) | 
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            T,
            
             class
            
            Alloc,
            
             class
            
            NonPair
            
             >
            
             
         
             
              constexpr
             
             
              auto
             
             uses_allocator_construction_args
             
              (
             
             
              const
             
             Alloc
             
              &
             
             alloc,
               | 
         (9) | (since C++20) | 
       Prepares the argument list needed to create an object of the given type
       
        T
       
       by means of
       
        uses-allocator construction
       
       .
      
        T
       
       is not a specialization of
       
        
         std::pair
        
       
       . Returns
       
        
         std::tuple
        
       
       determined as follows:
       - If std:: uses_allocator_v < T, Alloc > is false and std:: is_constructible_v < T, Args... > is true , returns std:: forward_as_tuple ( std:: forward < Args > ( args ) ... ) .
 - 
         Otherwise, if
         
          
           
            
             std::
             
              uses_allocator_v
             
            
           
           
            <
           
           T, Alloc
           
            >
           
          
         
         is
         
          
           
            true
           
          
         
         and
         
          
           
            
             std::
             
              is_constructible_v
             
            
           
           
            <
           
           T,
           
            
             std::
             
              allocator_arg_t
             
            
           
           ,
           
            const
           
           Alloc
           
            &
           
           , Args...
           
            >
           
          
         
         is
         
          
           
            true
           
          
         
         , returns
         
std:: tuple < std:: allocator_arg_t , const Alloc & , Args && ... > ( std:: allocator_arg , alloc,
std:: forward < Args > ( args ) ... ) . - Otherwise, if std:: uses_allocator_v < T, Alloc > is true and std:: is_constructible_v < T, Args..., const Alloc & > is true , returns std:: forward_as_tuple ( std:: forward < Args > ( args ) ..., alloc ) .
 - Otherwise, the program is ill-formed.
 
        T
       
       is a specialization of
       
        
         std::pair
        
       
       . For
       
        T
       
       that is
       
        
         
          
           std::
           
            pair
           
          
         
         
          <
         
         T1, T2
         
          >
         
        
       
       , equivalent to
       return std::make_tuple(std::piecewise_construct, std::apply([&alloc](auto&&... args1) { return std::uses_allocator_construction_args<T1>(alloc, std::forward<decltype(args1)>(args1)...); }, std::forward<Tuple1>(x) ), std::apply([&alloc](auto&&... args2) { return std::uses_allocator_construction_args<T2>(alloc, std::forward<decltype(args2)>(args2)...); }, std::forward<Tuple2>(y) ) );
        T
       
       is a specialization of
       
        
         std::pair
        
       
       . Equivalent to
       return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::tuple<>{}, std::tuple<>{} );
        T
       
       is a specialization of
       
        
         std::pair
        
       
       . Equivalent to
       return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(u)), std::forward_as_tuple(std::forward<V>(v)) );
        T
       
       is a specialization of
       
        
         std::pair
        
       
       . Equivalent to
       return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::forward_as_tuple(pr.first), std::forward_as_tuple(pr.second) );
        T
       
       is a specialization of
       
        
         std::pair
        
       
       . Equivalent to
       return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::forward_as_tuple(std::get<0>(std::move(pr))), std::forward_as_tuple(std::get<1>(std::move(pr))) );
        T
       
       is a specialization of
       
        
         std::pair
        
       
       , and given the exposition-only function template
       template<class A, class B> void /*deduce-as-pair*/(const std::pair<A, B>&);
        ,
        
         
          
           /*deduce-as-pair*/
          
          
           (
          
          non_pair
          
           )
          
         
        
        is ill-formed when considered as an unevaluated operand.
        
        Let the exposition-only class
        
         
          pair-constructor
         
        
        be defined as
       
class /*pair-constructor*/ { const Alloc& alloc_; // exposition only NonPair& u_; // exposition only constexpr reconstruct(const std::remove_cv<T>& p) const // exposition only { return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, p); } constexpr reconstruct(std::remove_cv<T>&& p) const // exposition only { return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, std::move(p)); } public: constexpr operator std::remove_cv<T>() const { return reconstruct(std::forward<NonPair>(u_)); } };
        pair_construction
       
       is a value of type
       
        
         pair-constructor
        
       
       whose
       
        
         alloc_
        
       
       and
       
        
         u_
        
       
       members are
       
        alloc
       
       and
       
        non_pair
       
       respectively.
      Parameters
| alloc | - | the allocator to use | 
| args | - | 
         the arguments to pass to
         
          T
         
         's constructor
         | 
       
| x | - | 
         tuple of arguments to pass to the constructors of
         
          T
         
         's
         
          first
         
         data member
         | 
       
| y | - | 
         tuple of arguments to pass to the constructors of
         
          T
         
         's
         
          second
         
         data member
         | 
       
| u | - | 
         single argument to pass to the constructor of
         
          T
         
         's
         
          first
         
         data member
         | 
       
| v | - | 
         single argument to pass to the constructor of
         
          T
         
         's
         
          second
         
         data member
         | 
       
| pr | - | 
         a pair whose
         
          first
         
         data member will be passed to the constructor of
         
          T
         
         's
         
          first
         
         data member and
         
          second
         
         data member will be passed to the constructor of
         
          T
         
         's
         
          second
         
         data member
         | 
       
| non_pair | - | single argument to convert to a std::pair for further construction | 
Return value
       
        
         std::tuple
        
       
       of arguments suitable for passing to the constructor of
       
        T
       
       .
      
Notes
The overloads (2-9) provide allocator propagation into std::pair , which supports neither leading-allocator nor trailing-allocator calling conventions (unlike, e.g. std::tuple , which uses leading-allocator convention).
       When used in uses-allocator construction, the conversion function of
       
        
         pair-constructor
        
       
       converts the provided argument to
       
        
         std::pair
        
       
       at first, and then constructs the result from that
       
        
         std::pair
        
       
       by uses-allocator construction.
      
Example
| 
         This section is incomplete
          Reason: no example  | 
       
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 3525 | C++20 | 
         no overload could handle non-
         
          pair
         
         types convertible to
         
          pair
         
         | 
        reconstructing overload added | 
See also
| 
          
           
            
             
              (C++11)
             
            
           
           
          | 
        
         checks if the specified type supports uses-allocator construction
          (class template)  | 
       
| 
          
           
            
             
              (C++20)
             
            
           
           
          | 
        
         creates an object of the given type by means of uses-allocator construction
          (function template)  | 
       
| 
         creates an object of the given type at specified memory location by means of uses-allocator construction
          (function template)  |