// bslma_constructionutil_cpp03.h                                     -*-C++-*-

// Automatically generated file.  **DO NOT EDIT**

#ifndef INCLUDED_BSLMA_CONSTRUCTIONUTIL_CPP03
#define INCLUDED_BSLMA_CONSTRUCTIONUTIL_CPP03

//@PURPOSE: Provide C++03 implementation for bslma_constructionutil.h
//
//@CLASSES: See bslma_constructionutil.h for list of classes
//
//@SEE_ALSO: bslma_constructionutil
//
//@DESCRIPTION:  This component is the C++03 translation of a C++11 component,
// generated by the 'sim_cpp11_features.pl' program.  If the original header
// contains any specially delimited regions of C++11 code, then this generated
// file contains the C++03 equivalent, i.e., with variadic templates expanded
// and rvalue-references replaced by 'bslmf::MovableRef' objects.  The header
// code in this file is designed to be '#include'd into the original header
// when compiling with a C++03 compiler.  If there are no specially delimited
// regions of C++11 code, then this header contains no code and is not
// '#include'd in the original header.
//
// Generated on Thu Oct 21 10:11:37 2021
// Command line: sim_cpp11_features.pl bslma_constructionutil.h

#ifdef COMPILING_BSLMA_CONSTRUCTIONUTIL_H

namespace BloombergLP {
namespace bslma {

// Workaround for optimization issue in xlC that mishandles pointer aliasing.
//   IV56864: ALIASING BEHAVIOUR FOR PLACEMENT NEW
//   http://www-01.ibm.com/support/docview.wss?uid=swg1IV56864
// Place this macro following each use of placement new.  Alternatively,
// compile with xlC_r -qalias=noansi, which reduces optimization opportunities
// across entire translation unit instead of simply across optimization fence.
// Update: issue is fixed in xlC 13.1 (__xlC__ >= 0x0d01).

#if defined(BSLS_PLATFORM_CMP_IBM) && BSLS_PLATFORM_CMP_VERSION < 0x0d01
    #define BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX                     \
                             BSLS_PERFORMANCEHINT_OPTIMIZATION_FENCE
#else
    #define BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX
#endif

struct ConstructionUtil_Imp;

                          // =======================
                          // struct ConstructionUtil
                          // =======================

struct ConstructionUtil {
    // This 'struct' provides a namespace for utility functions that construct
    // elements of (a template parameter) 'TARGET_TYPE'.

  private:
    // PRIVATE TYPES
    typedef ConstructionUtil_Imp Imp;
        // This 'typedef' is a convenient alias for the implementation-specific
        // utility class defined in this component.

  public:
    // CLASS METHODS
    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE *address, bslma::Allocator *allocator);
    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE *address, void *allocator);
        // Create a default-constructed object of (template parameter)
        // 'TARGET_TYPE' at the specified 'address'.  If 'allocator' is of type
        // 'bslma::Allocator' and 'TARGET_TYPE' supports 'bslma'-style
        // allocation, 'allocator' is passed to the default constructor.  If
        // the constructor throws, the memory at 'address' is left in an
        // unspecified state.  Note that this operation may bypass the call to
        // the default constructor of a user-defined type entirely if
        // 'TARGET_TYPE' 1) does not use 'bslma'-style allocators and 2) has a
        // trivial default constructor.

    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE        *address,
                          bslma::Allocator   *allocator,
                          const TARGET_TYPE&  original);
    template <class TARGET_TYPE>
    static void
    construct(TARGET_TYPE *address, void *, const TARGET_TYPE& original);
    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE        *address,
                          bslma::Allocator   *allocator,
                          TARGET_TYPE&        original);
    template <class TARGET_TYPE>
    static void
    construct(TARGET_TYPE *address, void *, TARGET_TYPE& original);
        // Create an object of (template parameter) 'TARGET_TYPE', having
        // the same value as the specified 'original' object, at the specified
        // 'address'.  If 'allocator' is of type 'bslma::Allocator' and
        // 'TARGET_TYPE' supports 'bslma'-style allocation, 'allocator' is
        // propagated to the newly created object.  If a constructor throws,
        // the memory at 'address' is left in an unspecified state.  Note that
        // this operation may elide the call to the copy constructor entirely
        // if 'TARGET_TYPE' 1) does not use 'bslma'-style allocators and 2) is
        // trivially copyable.  Further note that we provide (unconventional)
        // overloads for modifiable lvalues because these may match more
        // generic overloads (below) taking a variable number of deduced
        // template parameters.

    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE                    *address,
                          bslma::Allocator               *allocator,
                          bslmf::MovableRef<TARGET_TYPE>  original);
    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE                    *address,
                          void                           *allocator,
                          bslmf::MovableRef<TARGET_TYPE>  original);
        // Create an object of (template parameter) 'TARGET_TYPE', having
        // the same value as the specified 'original' object, at the specified
        // 'address'.  'original' is left in a valid but unspecified state.  If
        // the specified 'allocator' is of type 'bslma::Allocator' and
        // 'TARGET_TYPE' supports 'bslma'-style allocation, 'allocator' is
        // propagated to the newly created object.  If a constructor throws,
        // the memory at 'address' is left in an unspecified state.  Note that
        // this operation may elide the call to the copy constructor entirely
        // if 'TARGET_TYPE' 1) does not use 'bslma'-style allocators and 2) is
        // trivially copyable.  Further note that we provide (unconventional)
        // overloads for modifiable lvalues because these may match more
        // generic overloads (below) taking a variable number of deduced
        // template parameters.

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslma_constructionutil.h
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT 15
#endif
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#endif
#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 0
    template <class TARGET_TYPE, class ARG1>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 1
    template <class TARGET_TYPE, class ARG1, class ARGS_01>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 2
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 3
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 4
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 5
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 6
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 7
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 8
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 9
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 10
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 11
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 12
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 13
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 14
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13,
                                             class ARGS_14>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 15
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13,
                                             class ARGS_14,
                                             class ARGS_15>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 15

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 0
    template <class TARGET_TYPE, class ARG1>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 1
    template <class TARGET_TYPE, class ARG1, class ARGS_01>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 2
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 3
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 4
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 5
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 6
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 7
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 8
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 9
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 10
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 11
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 12
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 13
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 14
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13,
                                             class ARGS_14>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 15
    template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                             class ARGS_02,
                                             class ARGS_03,
                                             class ARGS_04,
                                             class ARGS_05,
                                             class ARGS_06,
                                             class ARGS_07,
                                             class ARGS_08,
                                             class ARGS_09,
                                             class ARGS_10,
                                             class ARGS_11,
                                             class ARGS_12,
                                             class ARGS_13,
                                             class ARGS_14,
                                             class ARGS_15>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_A >= 15

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.
    template <class TARGET_TYPE, class ARG1, class... ARGS>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments);
    template <class TARGET_TYPE, class ARG1, class... ARGS>
    static void construct(TARGET_TYPE *address,
                          void        *allocator,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument,
                         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments);
// }}} END GENERATED CODE
#endif

    template <class TARGET_TYPE, class ALLOCATOR>
    static void destructiveMove(TARGET_TYPE *address,
                                ALLOCATOR   *allocator,
                                TARGET_TYPE *original);
        // Create an object of (template parameter) 'TARGET_TYPE' at the
        // specified 'address' having the same value as the object at the
        // specified 'original' address, propagating the specified 'allocator'
        // to the moved object if 'TARGET_TYPE' uses 'bslma'-style allocation
        // and the (template parameter) type 'ALLOCATOR' is implicitly
        // convertible to 'bslma::Allocator', and destroy 'original'.  If the
        // move constructor throws an exception, the memory at 'address' is
        // left in an unspecified state and 'original' is left in a valid but
        // unspecified state.  The behavior is undefined unless either
        // 'TARGET_TYPE' does not support 'bslma'-style allocation or
        // 'original' uses 'allocator' to supply memory.  Note that this class
        // method is equivalent to move-constructing an object at 'address'
        // from '*original' and then destroying 'original', except that this
        // method elides the calls to the constructor and destructor for
        // objects that are bitwise movable.  Also note that if 'original'
        // actually points to an object of a type derived from 'TARGET_TYPE'
        // (i.e., a slicing move) where 'TARGET_TYPE' has a non-'virtual'
        // destructor and is not bitwise-movable, then 'original' will be only
        // partially destroyed.

#if defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)
    template <class TARGET_TYPE>
    static TARGET_TYPE make(bslma::Allocator *allocator);
    template <class TARGET_TYPE>
    static TARGET_TYPE make(void             *allocator);
        // Return, by value, an object of the specified (template parameter)
        // 'TARGET_TYPE', having default value.  If the specified 'allocator'
        // is a pointer to a class derived from 'bslma::Allocator *' and
        // 'TARGET_TYPE' supports 'bslma'-style allocation, 'allocator' is
        // propagated to the newly created object; otherwise, 'allocator' is
        // ignored.  Note that this method is available only for compilers that
        // reliably implement copy/move elision (i.e., RVO) on the returned
        // object.  This copy/move elision is required starting with C++17 and
        // is widely implemented, though optional, prior to C++17.

    template <class TARGET_TYPE, class ANY_TYPE>
    static TARGET_TYPE make(
                        bslma::Allocator                            *allocator,
                        BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)  argument);
    template <class TARGET_TYPE,class ANY_TYPE>
    static TARGET_TYPE make(
                        void                                        *allocator,
                        BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)  argument);
        // Return, by value, an object of the specified (template parameter)
        // 'TARGET_TYPE', constructed from the specified 'argument'.  If the
        // specified 'allocator' is a pointer to a class derived from
        // 'bslma::Allocator *' and 'TARGET_TYPE' supports 'bslma'-style
        // allocation, 'allocator' is propagated to the newly created object;
        // otherwise, 'allocator' is ignored.  Note that this method is
        // available only for compilers that reliably implement copy/move
        // elision (i.e., RVO) on the returned object.  This copy/move elision
        // is required starting with C++17 and is widely implemented, though
        // optional, prior to C++17.

#endif // defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)

};
                        // ===========================
                        // struct ConstructionUtil_Imp
                        // ===========================

struct ConstructionUtil_Imp {
    // This 'struct' provides a namespace for a suite of utility functions that
    // are used to implement functions in 'ConstructionUtil'.  In particular,
    // they provide overloads, resolved at compile-time, for various features
    // (e.g., passing down the allocator to sub-elements of 'pair'-like types)
    // and optimizations (e.g., bypassing the call to the constructor for
    // classes with trivial default and copy constructors).  These functions
    // should not be used outside this component.

    // TYPES
    enum {
        // These constants are used in the overloads below, when the last
        // argument is of type 'bsl::integral_constant<int, N> *', indicating
        // that 'TARGET_TYPE' has the traits for which the enumerator equal to
        // 'N' is named.

        e_USES_ALLOCATOR_ARG_T_TRAITS     = 5, // Implies USES_BSLMA_ALLOCATOR
        e_USES_BSLMA_ALLOCATOR_TRAITS     = 4,
        e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS = 3,
        e_BITWISE_COPYABLE_TRAITS         = 2,
        e_BITWISE_MOVABLE_TRAITS          = 1,
        e_NIL_TRAITS                      = 0
    };

    // CLASS METHODS
    template <class TARGET_TYPE>
    static void construct(
             TARGET_TYPE      *address,
             bslma::Allocator *allocator,
             bsl::integral_constant<int, e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS> *);

    template <class TARGET_TYPE>
    static void construct(
             TARGET_TYPE *address,
             bsl::integral_constant<int, e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS> *);
        // Construct a default instance of (template parameter) 'TARGET_TYPE'
        // that has a trivial default constructor, at the specified 'address'.
        // If the constructor throws, the memory at 'address' is left in an
        // unspecified state.  Note that the behavior is undefined if
        // 'TARGET_TYPE' supports 'bslma'-style allocators.

    // In order to implement:
    //   'allocator_traits<A>::construct(m, p, rv)'
    //   'allocator_traits<A>::construct(m, p,  v)'
    // if 'e_BITWISE_COPYABLE_TRAITS'.

    template <class TARGET_TYPE>
    static void
    construct(TARGET_TYPE        *address,
              bslma::Allocator   *allocator,
              bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
              const TARGET_TYPE&  original);

    template <class TARGET_TYPE>
    static void
    construct(TARGET_TYPE        *address,
              bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
              const TARGET_TYPE&  original);
        // Create an object of a bitwise copyable (template parameter)
        // 'TARGET_TYPE' at the specified 'address', with the same value as the
        // specified 'original' object.  If the constructor throws, the memory
        // at 'address' is left in an unspecified state.  Note that the
        // behavior is undefined if 'TARGET_TYPE' supports 'bslma'-style
        // allocators.

    template <class TARGET_TYPE>
    static void
    construct(
             TARGET_TYPE                                            *address,
             bslma::Allocator                                       *allocator,
             bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
             bslmf::MovableRef<TARGET_TYPE>                          original);
    template <class TARGET_TYPE>
    static void
    construct(
             TARGET_TYPE                                            *address,
             bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
             bslmf::MovableRef<TARGET_TYPE>                          original);
        // Create an object of a bitwise moveable (template parameter)
        // 'TARGET_TYPE' at the specified 'address', with the same value as the
        // specified 'original' object.  If the constructor throws, the memory
        // at 'address' is left in an unspecified state.  Note that the
        // behavior is undefined if 'TARGET_TYPE' supports 'bslma'-style
        // allocators.

    // In order to implement:
    //   'allocator_traits<A>::construct(m, p    )'
    //   'allocator_traits<A>::construct(m, p, rv)'
    //   'allocator_traits<A>::construct(m, p,  v)'
    // if 'e_USES_BSLMA_ALLOCATOR_TRAITS', and:
    //   'allocator_traits<A>::construct(m, p, args)'

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslma_constructionutil.h
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT 15
#endif
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#endif
#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0
    template <class TARGET_TYPE>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1
    template <class TARGET_TYPE, class ARGS_01>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14,
                                 class ARGS_15>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0
    template <class TARGET_TYPE>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1
    template <class TARGET_TYPE, class ARGS_01>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14,
                                 class ARGS_15>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15


#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0
    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1
    template <class TARGET_TYPE, class ARGS_01>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14,
                                 class ARGS_15>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15


#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0
    template <class TARGET_TYPE>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1
    template <class TARGET_TYPE, class ARGS_01>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15
    template <class TARGET_TYPE, class ARGS_01,
                                 class ARGS_02,
                                 class ARGS_03,
                                 class ARGS_04,
                                 class ARGS_05,
                                 class ARGS_06,
                                 class ARGS_07,
                                 class ARGS_08,
                                 class ARGS_09,
                                 class ARGS_10,
                                 class ARGS_11,
                                 class ARGS_12,
                                 class ARGS_13,
                                 class ARGS_14,
                                 class ARGS_15>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                      BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15);
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_B >= 15

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.
    template <class TARGET_TYPE, class... ARGS>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments);
    template <class TARGET_TYPE, class... ARGS>
    static void construct(
                  TARGET_TYPE      *address,
                  bslma::Allocator *allocator,
                  bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
                  BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments);

    template <class TARGET_TYPE, class... ARGS>
    static void construct(TARGET_TYPE      *address,
                          bslma::Allocator *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments);

    template <class TARGET_TYPE, class... ARGS>
    static void construct(TARGET_TYPE      *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments);
// }}} END GENERATED CODE
#endif

#if defined(BSLS_PLATFORM_CMP_MSVC) && BSLS_PLATFORM_CMP_VERSION < 1900
    template <class TARGET_TYPE>
    static void defaultConstructScalar(bsl::false_type, TARGET_TYPE *address);
        // Value-initialize a scalar object of the (template parameter)
        // 'TARGET_TYPE' at the specified 'address'.  The unused
        // 'bsl::false_type' value indicates that the scalar 'TARGET_TYPE' is
        // not a pointer-to-member.

    template <class TARGET_TYPE>
    static void defaultConstructScalar(bsl::true_type, TARGET_TYPE *address);
        // Value-initialize a pointer-to-member at the specified 'address' to
        // the null pointer value.  Note that early versions of the Microsoft
        // Visual C++ compiler would fail to initialize such an object when
        // requested with the simple value-initialization syntax of
        // 'new (address) TYPE();', requiring this additional workaround.
#endif

    template <class TARGET_TYPE, class ALLOCATOR>
    static void destructiveMove(
              TARGET_TYPE                                           *address,
              ALLOCATOR                                             *allocator,
              bsl::integral_constant<int, e_BITWISE_MOVABLE_TRAITS> *,
              TARGET_TYPE                                           *original);
        // Move the bitwise movable object of (template parameter)
        // 'TARGET_TYPE' at the specified 'original' address to the specified
        // 'address', eliding the call to the move constructor and destructor
        // in favor of performing a bitwise copy.  The behavior is undefined
        // unless either 'TARGET_TYPE' does not support 'bslma'-style
        // allocation or 'original' uses the specified 'allocator' to supply
        // memory.

    template <class TARGET_TYPE, class ALLOCATOR>
    static void destructiveMove(
                          TARGET_TYPE                               *address,
                          ALLOCATOR                                 *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                          TARGET_TYPE                               *original);
        // Create an object of (template parameter) 'TARGET_TYPE' at the
        // specified 'address' having the same value as the object at the
        // specified 'original' address, propagating the specified 'allocator'
        // to the moved object if 'TARGET_TYPE' uses 'bslma'-style allocation
        // and the (template parameter) type 'ALLOCATOR' is implicitly
        // convertible to 'bslma::Allocator', and destroy 'original'.  If the
        // move constructor throws an exception, the memory at 'address' is
        // left in an unspecified state and 'original' is left in a valid but
        // unspecified state.  The behavior is undefined unless either
        // 'TARGET_TYPE' does not support 'bslma'-style allocation or
        // 'original' uses 'allocator' to supply memory.  Note that this class
        // method is equivalent to move-constructing an object at 'address'
        // from '*original' and then destroying 'original'.  Also note that if
        // 'original' actually points to an object of a type derived from
        // 'TARGET_TYPE' (i.e., a slicing move) where 'TARGET_TYPE' has a
        // non-'virtual' destructor, then 'original' will be only partially
        // destroyed.

#if defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)
    template <class TARGET_TYPE>
    static TARGET_TYPE make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *);
    template <class TARGET_TYPE>
    static TARGET_TYPE make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *);
    template <class TARGET_TYPE>
    static TARGET_TYPE make(bslma::Allocator *allocator,
                            bsl::integral_constant<int, e_NIL_TRAITS> *);
        // Return, by value, a default-constructed object of the specified
        // (template parameter) 'TARGET_TYPE', using the specified 'allocator'
        // to supply memory.  The 'integral_constant' pointer argument is used
        // to dispatch on various traits so that the correct constructor is
        // invoked for the specified 'TARGET_TYPE'.

    template <class TARGET_TYPE, class ANY_TYPE>
    static TARGET_TYPE make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)                 argument);
    template <class TARGET_TYPE, class ANY_TYPE>
    static TARGET_TYPE make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)                 argument);
    template <class TARGET_TYPE, class ANY_TYPE>
    static TARGET_TYPE make(
                        bslma::Allocator                            *allocator,
                        bsl::integral_constant<int, e_NIL_TRAITS>   *,
                        BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)  argument);
        // Return, by value, an object of the specified (template parameter)
        // 'TARGET_TYPE', constructed from the specified 'argument' object,
        // using the specified 'allocator' to supply memory.  The
        // 'integral_constant' pointer argument is used to dispatch on various
        // traits so that the correct constructor is invoked for the specified
        // 'TARGET_TYPE'.

#endif // defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)

    template <class TARGET_TYPE>
    static void *voidify(TARGET_TYPE *address);
        // Return the specified 'address' cast as a pointer to 'void', even if
        // the (template parameter) 'TARGET_TYPE' is cv-qualified.
};

// ============================================================================
//                      TEMPLATE FUNCTION DEFINITIONS
// ============================================================================

                          // -----------------------
                          // struct ConstructionUtil
                          // -----------------------

// CLASS METHODS
template <class TARGET_TYPE>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : bsl::is_trivially_default_constructible<TARGET_TYPE>::value
                    ? Imp::e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS
                    : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0);
}

template <class TARGET_TYPE>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *)
{
    enum {
        k_VALUE = bsl::is_trivially_default_constructible<TARGET_TYPE>::value
                ? Imp::e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address, (bsl::integral_constant<int, k_VALUE>*)0);
}

template <class TARGET_TYPE>
inline
void ConstructionUtil::construct(TARGET_TYPE        *address,
                                 bslma::Allocator   *allocator,
                                 const TARGET_TYPE&  original)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : bsl::is_trivially_copyable<TARGET_TYPE>::value
                    ? Imp::e_BITWISE_COPYABLE_TRAITS
                    : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE> *)0,
                   original);
}

template <class TARGET_TYPE>
inline
void ConstructionUtil::construct(TARGET_TYPE      *address,
                                 bslma::Allocator *allocator,
                                 TARGET_TYPE&      original)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : bsl::is_trivially_copyable<TARGET_TYPE>::value
                    ? Imp::e_BITWISE_COPYABLE_TRAITS
                    : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE> *)0,
                   original);
}

template <class TARGET_TYPE>
inline
void ConstructionUtil::construct(TARGET_TYPE        *address,
                                 void               *,
                                 const TARGET_TYPE&  original)
{
    enum {
        k_VALUE = bsl::is_trivially_copyable<TARGET_TYPE>::value
                ? Imp::e_BITWISE_COPYABLE_TRAITS
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   original);
}

template <class TARGET_TYPE>
inline
void ConstructionUtil::construct(TARGET_TYPE  *address,
                                 void         *,
                                 TARGET_TYPE&  original)
{
    enum {
        k_VALUE = bsl::is_trivially_copyable<TARGET_TYPE>::value
                ? Imp::e_BITWISE_COPYABLE_TRAITS
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   original);
}

template <class TARGET_TYPE>
inline
void ConstructionUtil::construct(TARGET_TYPE                    *address,
                                 bslma::Allocator               *allocator,
                                 bslmf::MovableRef<TARGET_TYPE>  original)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : bsl::is_trivially_copyable<TARGET_TYPE>::value
                 ? Imp::e_BITWISE_COPYABLE_TRAITS
                 : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE> *)0,
                   BSLS_COMPILERFEATURES_FORWARD(TARGET_TYPE, original));
}

template <class TARGET_TYPE>
inline
void ConstructionUtil::construct(TARGET_TYPE                    *address,
                                 void                           *,
                                 bslmf::MovableRef<TARGET_TYPE>  original)
{

    enum {
        k_VALUE = bsl::is_trivially_copyable<TARGET_TYPE>::value
                ? Imp::e_BITWISE_COPYABLE_TRAITS
                : Imp::e_NIL_TRAITS
    };

    Imp::construct(address,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(TARGET_TYPE, original));
}

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslma_constructionutil.h
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT 15
#endif
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#endif
#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 0
template <class TARGET_TYPE, class ARG1>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 1
template <class TARGET_TYPE, class ARG1, class ARGS_01>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 2
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 3
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 4
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 5
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 6
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 7
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 8
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 9
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 10
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 11
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 12
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 13
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12,
                                         class ARGS_13>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 14
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12,
                                         class ARGS_13,
                                         class ARGS_14>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 15
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12,
                                         class ARGS_13,
                                         class ARGS_14,
                                         class ARGS_15>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS_15,arguments_15));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 15


#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 0
template <class TARGET_TYPE, class ARG1>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 1
template <class TARGET_TYPE, class ARG1, class ARGS_01>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 2
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 3
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 4
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 5
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 6
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 7
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 8
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 9
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 10
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 11
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 12
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 13
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12,
                                         class ARGS_13>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 14
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12,
                                         class ARGS_13,
                                         class ARGS_14>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 15
template <class TARGET_TYPE, class ARG1, class ARGS_01,
                                         class ARGS_02,
                                         class ARGS_03,
                                         class ARGS_04,
                                         class ARGS_05,
                                         class ARGS_06,
                                         class ARGS_07,
                                         class ARGS_08,
                                         class ARGS_09,
                                         class ARGS_10,
                                         class ARGS_11,
                                         class ARGS_12,
                                         class ARGS_13,
                                         class ARGS_14,
                                         class ARGS_15>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_15,arguments_15));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_C >= 15

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.
template <class TARGET_TYPE, class ARG1, class... ARGS>
inline
void
ConstructionUtil::construct(TARGET_TYPE      *address,
                            bslma::Allocator *allocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                 ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                 : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };
    Imp::construct(address,
                   allocator,
                   (bsl::integral_constant<int, k_VALUE>*)0,
                   BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                   BSLS_COMPILERFEATURES_FORWARD(ARGS,arguments)...);
}

template <class TARGET_TYPE, class ARG1, class... ARGS>
inline
void
ConstructionUtil::construct(TARGET_TYPE *address,
                            void        *,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARG1) argument1,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments)
{
    ::new (Imp::voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARG1,argument1),
                             BSLS_COMPILERFEATURES_FORWARD(ARGS,arguments)...);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
// }}} END GENERATED CODE
#endif

template <class TARGET_TYPE, class ALLOCATOR>
inline
void
ConstructionUtil::destructiveMove(TARGET_TYPE *address,
                                  ALLOCATOR   *allocator,
                                  TARGET_TYPE *original)
{
    BSLS_ASSERT_SAFE(address);
    BSLS_ASSERT_SAFE(original);

    enum {
        k_VALUE = bslmf::IsBitwiseMoveable<TARGET_TYPE>::value
                ? Imp::e_BITWISE_MOVABLE_TRAITS
                : Imp::e_NIL_TRAITS
    };

    Imp::destructiveMove(address,
                         allocator,
                         (bsl::integral_constant<int, k_VALUE>*)0,
                         original);
}

#if defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)
// Suppress bde_verify warnings about return-by-value in this region.
// BDE_VERIFY pragma: push
// BDE_VERIFY pragma: -AR01: Type using allocator is returned by value

template <class TARGET_TYPE>
inline
TARGET_TYPE
ConstructionUtil::make(bslma::Allocator *allocator)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                   ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                   : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };

    return Imp::make<TARGET_TYPE>(allocator,
                                  (bsl::integral_constant<int, k_VALUE> *) 0);
}

template <class TARGET_TYPE>
inline
TARGET_TYPE
ConstructionUtil::make(void *)
{
    return TARGET_TYPE();
}

template <class TARGET_TYPE, class ANY_TYPE>
inline
TARGET_TYPE
ConstructionUtil::make(bslma::Allocator                            *allocator,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)  argument)
{
    enum {
        k_VALUE = bslma::UsesBslmaAllocator<TARGET_TYPE>::value
                ? (bslmf::UsesAllocatorArgT<TARGET_TYPE>::value
                   ? Imp::e_USES_ALLOCATOR_ARG_T_TRAITS
                   : Imp::e_USES_BSLMA_ALLOCATOR_TRAITS)
                : Imp::e_NIL_TRAITS
    };

    return Imp::make<TARGET_TYPE>(allocator,
                                  (bsl::integral_constant<int, k_VALUE> *) 0,
                                  BSLS_COMPILERFEATURES_FORWARD(ANY_TYPE,
                                                                argument));
}

template <class TARGET_TYPE, class ANY_TYPE>
inline
TARGET_TYPE
ConstructionUtil::make(void                                        *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)  argument)
{
    return TARGET_TYPE(BSLS_COMPILERFEATURES_FORWARD(ANY_TYPE, argument));
}

// BDE_VERIFY pragma: pop
#endif // defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)

                       // ---------------------------
                       // struct ConstructionUtil_Imp
                       // ---------------------------

// CLASS METHODS
template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::construct(
              TARGET_TYPE *address,
              bslma::Allocator *,
              bsl::integral_constant<int, e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS> *)
{
    construct(address,
              (bsl::integral_constant<int,
                                      e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS> *) 0);
}

template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::construct(
              TARGET_TYPE *address,
              bsl::integral_constant<int, e_HAS_TRIVIAL_DEFAULT_CTOR_TRAITS> *)
{
#if defined(BSLS_PLATFORM_CMP_MSVC) && BSLS_PLATFORM_CMP_VERSION < 1900
    defaultConstructScalar(bsl::is_member_pointer<TARGET_TYPE>(), address);
#else
    ::new (voidify(address)) TARGET_TYPE();
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
#endif
}

template <class TARGET_TYPE>
inline
void ConstructionUtil_Imp::construct(
              TARGET_TYPE                                            *address,
              bslma::Allocator                                       *,
              bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
              const TARGET_TYPE&                                      original)
{
    construct(address,
              (bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS>*)0,
               original);
}

template <class TARGET_TYPE>
inline
void ConstructionUtil_Imp::construct(
              TARGET_TYPE                                            *address,
              bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
              const TARGET_TYPE&                                      original)
{
    ::new (voidify(address)) TARGET_TYPE(original);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}

template <class TARGET_TYPE>
inline
void ConstructionUtil_Imp::construct(
              TARGET_TYPE                                            *address,
              bslma::Allocator                                       *,
              bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
              bslmf::MovableRef<TARGET_TYPE>                          original)
{
    construct(address,
              (bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS>*)0,
              BSLS_COMPILERFEATURES_FORWARD(TARGET_TYPE, original));
}

template <class TARGET_TYPE>
inline
void ConstructionUtil_Imp::construct(
              TARGET_TYPE                                            *address,
              bsl::integral_constant<int, e_BITWISE_COPYABLE_TRAITS> *,
              bslmf::MovableRef<TARGET_TYPE>                          original)
{
    ::new (voidify(address)) TARGET_TYPE(BSLS_COMPILERFEATURES_FORWARD(
        TARGET_TYPE, bslmf::MovableRefUtil::move(original)));
}

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslma_constructionutil.h
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT 15
#endif
#ifndef BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D
#define BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT
#endif
#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0
template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *)
{
    ::new (voidify(address)) TARGET_TYPE(
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1
template <class TARGET_TYPE, class ARGS_01>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14,
                             class ARGS_15>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14),
                  BSLS_COMPILERFEATURES_FORWARD(ARGS_15,arguments_15),
                  allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15


#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0
template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1
template <class TARGET_TYPE, class ARGS_01>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14,
                             class ARGS_15>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_15,arguments_15));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15


#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0
template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0);
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1
template <class TARGET_TYPE, class ARGS_01>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, arguments_10));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, arguments_10),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, arguments_11));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, arguments_10),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, arguments_11),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, arguments_12));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, arguments_10),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, arguments_11),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, arguments_12),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, arguments_13));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, arguments_10),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, arguments_11),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, arguments_12),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, arguments_13),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_14, arguments_14));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14,
                             class ARGS_15>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, arguments_01),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, arguments_02),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, arguments_03),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, arguments_04),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, arguments_05),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, arguments_06),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, arguments_07),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, arguments_08),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, arguments_09),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, arguments_10),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, arguments_11),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, arguments_12),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, arguments_13),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_14, arguments_14),
              BSLS_COMPILERFEATURES_FORWARD(ARGS_15, arguments_15));
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15


#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0
template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *)
{
    ::new (voidify(address)) TARGET_TYPE(
                             );
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 0

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1
template <class TARGET_TYPE, class ARGS_01>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 1

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 2

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 3

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 4

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 5

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 6

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 7

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 8

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 9

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 10

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 11

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 12

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 13

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 14

#if BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15
template <class TARGET_TYPE, class ARGS_01,
                             class ARGS_02,
                             class ARGS_03,
                             class ARGS_04,
                             class ARGS_05,
                             class ARGS_06,
                             class ARGS_07,
                             class ARGS_08,
                             class ARGS_09,
                             class ARGS_10,
                             class ARGS_11,
                             class ARGS_12,
                             class ARGS_13,
                             class ARGS_14,
                             class ARGS_15>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) arguments_01,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) arguments_02,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) arguments_03,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) arguments_04,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) arguments_05,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) arguments_06,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) arguments_07,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) arguments_08,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) arguments_09,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) arguments_10,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) arguments_11,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) arguments_12,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) arguments_13,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) arguments_14,
                       BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_15) arguments_15)
{
    ::new (voidify(address)) TARGET_TYPE(
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_01,arguments_01),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_02,arguments_02),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_03,arguments_03),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_04,arguments_04),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_05,arguments_05),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_06,arguments_06),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_07,arguments_07),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_08,arguments_08),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_09,arguments_09),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_10,arguments_10),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_11,arguments_11),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_12,arguments_12),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_13,arguments_13),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_14,arguments_14),
                          BSLS_COMPILERFEATURES_FORWARD(ARGS_15,arguments_15));
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
#endif  // BSLMA_CONSTRUCTIONUTIL_VARIADIC_LIMIT_D >= 15

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.
template <class TARGET_TYPE, class... ARGS>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments)
{
    ::new (voidify(address)) TARGET_TYPE(
                  BSLS_COMPILERFEATURES_FORWARD(ARGS,arguments)..., allocator);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}

template <class TARGET_TYPE, class... ARGS>
inline
void
ConstructionUtil_Imp::construct(
         TARGET_TYPE                                                *address,
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments)
{
    ::new (voidify(address)) TARGET_TYPE(
                             bsl::allocator_arg,
                             allocator,
                             BSLS_COMPILERFEATURES_FORWARD(ARGS,arguments)...);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}

template <class TARGET_TYPE, class... ARGS>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bslma::Allocator                          *,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments)
{
    construct(address,
              (bsl::integral_constant<int, e_NIL_TRAITS> *)0,
              BSLS_COMPILERFEATURES_FORWARD(ARGS, arguments)...);
}

template <class TARGET_TYPE, class... ARGS>
inline
void
ConstructionUtil_Imp::construct(
                          TARGET_TYPE                               *address,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                          BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... arguments)
{
    ::new (voidify(address)) TARGET_TYPE(
                             BSLS_COMPILERFEATURES_FORWARD(ARGS,arguments)...);
    BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
}
// }}} END GENERATED CODE
#endif

#if defined(BSLS_PLATFORM_CMP_MSVC) && BSLS_PLATFORM_CMP_VERSION < 1900
template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::defaultConstructScalar(bsl::false_type,
                                             TARGET_TYPE *address)
{
    ::new (voidify(address)) TARGET_TYPE();
}

template <class TARGET_TYPE>
inline
void
ConstructionUtil_Imp::defaultConstructScalar(bsl::true_type,
                                             TARGET_TYPE *address)
{
    ::new (voidify(address)) TARGET_TYPE(nullptr);
}
#endif

template <class TARGET_TYPE, class ALLOCATOR>
inline
void
ConstructionUtil_Imp::destructiveMove(
               TARGET_TYPE                                           *address,
               ALLOCATOR                                             *,
               bsl::integral_constant<int, e_BITWISE_MOVABLE_TRAITS> *,
               TARGET_TYPE                                           *original)
{
    if (bsl::is_fundamental<TARGET_TYPE>::value ||
        bsl::is_pointer<TARGET_TYPE>::value) {
        ::new (voidify(address)) TARGET_TYPE(*original);
        BSLMA_CONSTRUCTIONUTIL_XLC_PLACEMENT_NEW_FIX;
    }
    else {
        // voidify(address) is used here to suppress compiler warning
        // "-Wclass-memaccess".
        memcpy(voidify(address), original, sizeof *original);
    }
}

template <class TARGET_TYPE, class ALLOCATOR>
inline
void
ConstructionUtil_Imp::destructiveMove(
                          TARGET_TYPE                               *address,
                          ALLOCATOR                                 *allocator,
                          bsl::integral_constant<int, e_NIL_TRAITS> *,
                          TARGET_TYPE                               *original)
{
    // TBD: should be ok with C++03 as well, but need to test edge cases first
#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
    ConstructionUtil::construct(address,
                                allocator,
                                bslmf::MovableRefUtil::move(*original));
#else
    ConstructionUtil::construct(address, allocator, *original);
#endif
    DestructionUtil::destroy(original);
}

#if defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)
// Suppress bde_verify warnings about return-by-value in this region.
// BDE_VERIFY pragma: push
// BDE_VERIFY pragma: -AR01: Type using allocator is returned by value

template <class TARGET_TYPE>
inline
TARGET_TYPE
ConstructionUtil_Imp::make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *)
{
    return TARGET_TYPE(allocator);
}

template <class TARGET_TYPE>
inline
TARGET_TYPE
ConstructionUtil_Imp::make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *)
{
    return TARGET_TYPE(bsl::allocator_arg, allocator);
}

template <class TARGET_TYPE>
inline
TARGET_TYPE
ConstructionUtil_Imp::make(bslma::Allocator                          *,
                           bsl::integral_constant<int, e_NIL_TRAITS> *)
{
    return TARGET_TYPE();
}

template <class TARGET_TYPE, class ANY_TYPE>
inline
TARGET_TYPE
ConstructionUtil_Imp::make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_BSLMA_ALLOCATOR_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)                 argument)
{
    return TARGET_TYPE(BSLS_COMPILERFEATURES_FORWARD(ANY_TYPE, argument),
                       allocator);
}

template <class TARGET_TYPE, class ANY_TYPE>
inline
TARGET_TYPE
ConstructionUtil_Imp::make(
         bslma::Allocator                                           *allocator,
         bsl::integral_constant<int, e_USES_ALLOCATOR_ARG_T_TRAITS> *,
         BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)                 argument)
{
    return TARGET_TYPE(bsl::allocator_arg, allocator,
                       BSLS_COMPILERFEATURES_FORWARD(ANY_TYPE, argument));
}

template <class TARGET_TYPE, class ANY_TYPE>
inline
TARGET_TYPE
ConstructionUtil_Imp::make(
                         bslma::Allocator                            *,
                         bsl::integral_constant<int, e_NIL_TRAITS>   *,
                         BSLS_COMPILERFEATURES_FORWARD_REF(ANY_TYPE)  argument)
{
    return TARGET_TYPE(BSLS_COMPILERFEATURES_FORWARD(ANY_TYPE, argument));
}

// BDE_VERIFY pragma: pop
#endif // defined(BSLS_COMPILERFEATURES_GUARANTEED_COPY_ELISION)

template <class TARGET_TYPE>
inline
void *ConstructionUtil_Imp::voidify(TARGET_TYPE *address)
{
    return static_cast<void *>(
            const_cast<typename bsl::remove_cv<TARGET_TYPE>::type *>(address));
}

}  // close package namespace
}  // close enterprise namespace

#else // if ! defined(DEFINED_BSLMA_CONSTRUCTIONUTIL_H)
# error Not valid except when included from bslma_constructionutil.h
#endif // ! defined(COMPILING_BSLMA_CONSTRUCTIONUTIL_H)

#endif // ! defined(INCLUDED_BSLMA_CONSTRUCTIONUTIL_CPP03)

// ----------------------------------------------------------------------------
// Copyright 2021 Bloomberg Finance L.P.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------- END-OF-FILE ----------------------------------