|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Defined in header <memory> | ||
T is not a specialization ofstd::pair | ||
template<class T,class Alloc,class...Args> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (1) | (since C++20) |
T is a specialization ofstd::pair | ||
template<class T,class Alloc,class Tuple1,class Tuple2> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (2) | (since C++20) |
template<class T,class Alloc> constexprauto uses_allocator_construction_args(const Alloc& alloc)noexcept; | (3) | (since C++20) |
template<class T,class Alloc,class U,class V> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (4) | (since C++20) |
template<class T,class Alloc,class U,class V> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (5) | (since C++23) |
template<class T,class Alloc,class U,class V> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (6) | (since C++20) |
template<class T,class Alloc,class U,class V> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (7) | (since C++20) |
template<class T,class Alloc,class U,class V> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (8) | (since C++23) |
template<class T,class Alloc,class NonPair> constexprauto uses_allocator_construction_args(const Alloc& alloc, | (9) | (since C++20) |
Prepares the argument list needed to create an object of the given typeT by means ofuses-allocator construction.
T is not a specialization ofstd::pair. Returnsstd::tuple determined as follows:T is a specialization ofstd::pair. ForT that isstd::pair<T1, T2>, equivalent toreturnstd::make_tuple(std::piecewise_construct,std::apply([&alloc](auto&&...args1){return std::uses_allocator_construction_args<T1>(alloc,std::forward<decltype(args1)>(args1)...);},std::forward<Tuple1>(x)),std::apply([&alloc](auto&&...args2){return std::uses_allocator_construction_args<T2>(alloc,std::forward<decltype(args2)>(args2)...);},std::forward<Tuple2>(y)));
T is a specialization ofstd::pair. Equivalent toreturn std::uses_allocator_construction_args<T>(alloc,std::piecewise_construct,std::tuple<>{},std::tuple<>{});
T is a specialization ofstd::pair. Equivalent toreturn std::uses_allocator_construction_args<T>(alloc,std::piecewise_construct,std::forward_as_tuple(std::forward<U>(u)),std::forward_as_tuple(std::forward<V>(v)));
T is a specialization ofstd::pair. Equivalent toreturn std::uses_allocator_construction_args<T>(alloc,std::piecewise_construct,std::forward_as_tuple(pr.first),std::forward_as_tuple(pr.second));
T is a specialization ofstd::pair. Equivalent toreturn std::uses_allocator_construction_args<T>(alloc,std::piecewise_construct,std::forward_as_tuple(std::get<0>(std::move(pr))),std::forward_as_tuple(std::get<1>(std::move(pr))));
T is a specialization ofstd::pair, and given the exposition-only function templatetemplate<class A,class B>void/*deduce-as-pair*/(conststd::pair<A, B>&);
,/*deduce-as-pair*/(non_pair) is ill-formed when considered as an unevaluated operand.
Let the exposition-only classpair-constructor be defined as
class/*pair-constructor*/{const Alloc& alloc_;// exposition only NonPair& u_;// exposition only constexpr reconstruct(conststd::remove_cv<T>& p)const// exposition only{returnstd::make_obj_using_allocator<std::remove_cv<T>>(alloc_, p);} constexpr reconstruct(std::remove_cv<T>&& p)const// exposition only{returnstd::make_obj_using_allocator<std::remove_cv<T>>(alloc_, std::move(p));} public:constexpr operatorstd::remove_cv<T>()const{return reconstruct(std::forward<NonPair>(u_));}};
pair_construction is a value of typepair-constructor whosealloc_ andu_ members arealloc andnon_pair respectively.Contents |
| alloc | - | the allocator to use |
| args | - | the arguments to pass toT's constructor |
| x | - | tuple of arguments to pass to the constructors ofT'sfirst data member |
| y | - | tuple of arguments to pass to the constructors ofT'ssecond data member |
| u | - | single argument to pass to the constructor ofT'sfirst data member |
| v | - | single argument to pass to the constructor ofT'ssecond data member |
| pr | - | a pair whosefirst data member will be passed to the constructor ofT'sfirst data member andsecond data member will be passed to the constructor ofT'ssecond data member |
| non_pair | - | single argument to convert to astd::pair for further construction |
std::tuple of arguments suitable for passing to the constructor ofT.
The overloads(2-9) provide allocator propagation intostd::pair, which supports neither leading-allocator nor trailing-allocator calling conventions (unlike, e.g.std::tuple, which uses leading-allocator convention).
When used in uses-allocator construction, the conversion function ofpair-constructor converts the provided argument tostd::pair at first, and then constructs the result from thatstd::pair by uses-allocator construction.
| This section is incomplete Reason: no example |
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3525 | C++20 | no overload could handle non-pair types convertible topair | reconstructing overload added |
(C++11) | checks if the specified type supports uses-allocator construction (class template)[edit] |
(C++20) | creates an object of the given type by means of uses-allocator construction (function template)[edit] |
| creates an object of the given type at specified memory location by means of uses-allocator construction (function template)[edit] |