std::pmr::polymorphic_allocator<T>:: construct
| 
           
            
             template
            
            
             <
            
            
             class
            
            U,
            
             class
            
            ...
            
             Args
            
            
             >
            
             void construct ( U * p, Args && ... args ) ; | (1) | (C++17 起) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            T1,
            
             class
            
            T2,
            
             class
            
            ...
            
             Args1
            
            ,
            
             class
            
            ...
            
             Args2
            
            
             >
            
             
             
              void
             
             construct
             
              (
             
             
              
               std::
               
                pair
               
              
             
             
              <
             
             T1, T2
             
              >
             
             
              *
             
             p,
              | (2) | (C++17 起) (C++20 前) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            T1,
            
             class
            
            T2
            
             >
            
             void construct ( std:: pair < T1, T2 > * p ) ; | (3) | (C++17 起) (C++20 前) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            T1,
            
             class
            
            T2,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             void construct ( std:: pair < T1, T2 > * p, U && x, V && y ) ; | (4) | (C++17 起) (C++20 前) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            T1,
            
             class
            
            T2,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             void construct ( std:: pair < T1, T2 > * p, const std:: pair < U, V > & xy ) ; | (5) | (C++17 起) (C++20 前) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            T1,
            
             class
            
            T2,
            
             class
            
            U,
            
             class
            
            V
            
             >
            
             void construct ( std:: pair < T1, T2 > * p, std:: pair < U, V > && xy ) ; | (6) | (C++17 起) (C++20 前) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            T1,
            
             class
            
            T2,
            
             class
            
            NonPair
            
             >
            
             void construct ( std:: pair < T1, T2 > * p, NonPair && non_pair ) ; | (7) | (C++17 起) (C++20 前) | 
在由 p 指向的已分配但未初始化的存储空间中,使用提供的构造函数参数构造对象。如果对象本身是使用分配器的类型,或者是 std::pair 类型,则向构造对象传递 * this 。
        U
       
       的对象。
       
        
         此重载仅当
         
          U
         
         不是
         
          
           std::pair
          
         
         的特化时才参与重载决议。
        
        
         
          (C++20 前)
         
        
       
      | 
          
           2)
          
          首先,如果
           
           T1
          或
           T2
          是分配器感知类型,则根据以下三条规则修改元组
          
           
            x
           
          
          和
          
           
            y
           
          
          以包含
           this->resource()
          ,得到两个新元组
           xprime
          和
           yprime
          :
          
           2a)
          
          如果
           
           T1
          不是分配器感知类型(
          
           
            
             
              std::
              
               uses_allocator
              
             
            
            
             <
            
            T1, polymorphic_allocator
            
             >
            
            
             ::
            
            
             value
            
            
             ==
            
            
             false
            
           
          
          )且
          
           
            
             
              std::
              
               is_constructible
              
             
            
            
             <
            
            T1, Args1...
            
             >
            
            
             ::
            
            
             value
            
            
             ==
            
            
             true
            
           
          
          ,则
           xprime
          为未经修改的
          
           
            x
           
          
          。
          
           2b)
          
          如果
           
           T1
          是分配器感知类型(
          
           
            
             
              std::
              
               uses_allocator
              
             
            
            
             <
            
            T1, polymorphic_allocator
            
             >
            
            
             ::
            
            
             value
            
            
             ==
            
            
             true
            
           
          
          ),且其构造函数接受分配器标签(
          
           
            
             
              std::
              
               is_constructible
              
             
            
            
             <
            
            T1,
            
             
              std::
              
               allocator_arg_t
              
             
            
            , polymorphic_allocator, Args1...
            
             >
            
            
             ::
            
            
             value
            
            
             ==
            
            
             true
            
           
          
          ),则
           xprime
          为
          
           
            
             
              std::
              
               tuple_cat
              
             
            
            
             (
            
            
             
              std::
              
               make_tuple
              
             
            
            
             (
            
            
             
              std::
              
               allocator_arg
              
             
            
            ,
            
             *
            
            this
            
             )
            
            , std
            
             ::
            
            
             move
            
            
             (
            
            x
            
             )
            
            
             )
            
           
          
          。
          
           2c)
          
          如果
           
           T1
          是分配器感知类型(
          
           
            
             
              std::
              
               uses_allocator
              
             
            
            
             <
            
            T1, polymorphic_allocator
            
             >
            
            
             ::
            
            
             value
            
            
             ==
            
            
             true
            
           
          
          ),且其构造函数将分配器作为最后一个参数(
          
           
            
             
              std::
              
               is_constructible
              
             
            
            
             <
            
            T1, Args1..., polymorphic_allocator
            
             >
            
            
             ::
            
            
             value
            
            
             ==
            
            
             true
            
           
          
          ),则
           xprime
          为
          
           
            
             
              std::
              
               tuple_cat
              
             
            
            
             (
            
            std
            
             ::
            
            
             move
            
            
             (
            
            x
            
             )
            
            ,
            
             
              std::
              
               make_tuple
              
             
            
            
             (
            
            
             *
            
            this
            
             )
            
            
             )
            
           
          
          。
          
           2d)
          
          否则程序非良构。
          
          
          
          相同规则适用于
           
           T2
          及将
          
           
            y
           
          
          替换为
           yprime
          。
          
          
          一旦构造了
           
           xprime
          和
           yprime
          ,就在已分配存储中构造 pair
          
           
            p
           
          
          ,如同通过
          
           
            
             ::
            
            
             new
            
            
             (
            
            
             (
            
            
             void
            
            
             *
            
            
             )
            
            p
            
             )
            
            pair
            
             <
            
            T1, T2
            
             >
            
            
             (
            
            
             
              std::
              
               piecewise_construct
              
             
            
            , std
            
             ::
            
            
             move
            
            
             (
            
            xprime
            
             )
            
            , std
            
             ::
            
            
             move
            
            
             (
            
            yprime
            
             )
            
            
             )
            
            
             ;
            
           
          
          。
          
           3)
          
          等价于
          
           
            construct
            
             (
            
            p,
            
             
              std::
              
               piecewise_construct
              
             
            
            ,
            
             
              std::
              
               tuple
              
             
            
            
             <>
            
            
             (
            
            
             )
            
            ,
            
             
              std::
              
               tuple
              
             
            
            
             <>
            
            
             (
            
            
             )
            
            
             )
            
           
          
          ,即如果 pair 的成员类型接受内存资源,则将内存资源传递给它们。
          
          
           4)
          
          等价于
           construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(x)), std::forward_as_tuple(std::forward<V>(y))) 
          
           5)
          
          等价于
           construct(p, std::piecewise_construct, std::forward_as_tuple(xy.first), std::forward_as_tuple(xy.second)) 
          
           6)
          
          等价于
           construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(xy.first)), std::forward_as_tuple(std::forward<V>(xy.second))) 
          
           7)
          
          此重载仅当给定仅用于说明的函数模板
           template< class A, class B > void /*deduce-as-pair*/( const std::pair<A, B>& ); ,且 /*deduce-as-pair*/ ( non_pair ) 作为未求值操作数时非良构,才参与重载决议。等价于 construct<T1, T2, T1, T2>(p, std::forward<NonPair>(non_pair)); | (C++20 前) | 
| 目录 | 
参数
| p | - | 指向已分配但未初始化存储的指针 | 
| args... | - | 传递给 
          T
         构造函数的构造参数 | 
| x | - | 传递给 
          T1
         构造函数的构造参数 | 
| y | - | 传递给 
          T2
         构造函数的构造参数 | 
| xy | - | 其两个成员分别为 
          T1
         和
          T2
         构造参数的对 | 
| non_pair | - | 需转换为 
          pair
         以进行后续构造的非
          pair
         参数 | 
返回值
(无)
注释
       此函数由任何支持分配器感知的对象(例如
       
        
         std::allocator_traits
        
       
       )通过
       
        
         std::pmr::vector
        
       
       (或另一个使用
       
        std::pmr::polymorphic_allocator
       
       作为分配器的
       
        
         std::vector
        
       
       )调用。
      
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用版本 | 发布时行为 | 正确行为 | 
|---|---|---|---|
| LWG 2969 | C++17 | 使用分配器构造传递了 
          resource()
          | 传递 * this | 
| LWG 2975 | C++17 | 某些情况下错误使用首个重载进行 pair 构造 | 约束为不接受 pair 类型 | 
| LWG 3525 | C++17 | 没有重载能处理可转换为 
          pair
         的非
          pair
         类型 | 添加了重构重载 | 
参见
| 
           
            
             
              [static]
             
            
           
           | 在已分配的存储空间中构造对象 (函数模板) | 
| 
           
            
             
              (until C++20)
             
            
           
           | 在已分配的存储空间中构造对象 ( 
           std::allocator<T>
          的公开成员函数) |