Description
Замечание: если специализация buildible_with_allocator_prefix::value верна, указывает, что T может быть построен с помощью allocator_arg и T::allocator_type в качестве первых двух аргументов конструктора. В идеале все конструкторы T (включая конструкторы копирования и перемещения) должны иметь вариант, который принимает эти два исходных аргумента.
Требуется: специализация Constructible_with_allocator_prefix:: значение истинно, T должен иметь вложенный тип, allocator_type и по меньшей мере один конструктор, для которого allocator_arg_t является первым параметром, а allocator_type — вторым параметром. Если не все конструкторы T могут быть вызваны с этими начальными аргументами, и если T используется в контексте, где контейнер должен вызвать такого конструктора, то программа плохо сформирована.
<template <class T, class Allocator = allocator<T> > class Y { public: typedef Allocator allocator_type;
>
<// Default constructor with and allocator-extended default constructor Y(); Y(allocator_arg_t, const allocator_type& a);
>
<// Copy constructor and allocator-extended copy constructor Y(const Y& yy); Y(allocator_arg_t, const allocator_type& a, const Y& yy);
>
<// Variadic constructor and allocator-extended variadic constructor template<class ...Args> Y(Args&& args...); template<class ...Args> Y(allocator_arg_t, const allocator_type& a, BOOST_FWD_REF(Args)... args); };
>
<// Specialize trait for class template Y template <class T, class Allocator = allocator<T> > structconstructible_with_allocator_prefix<Y<T,Allocator> > { static const bool value = true; };
>
<
>
Примечание: Эта черта является обходным путем, вдохновленным "N2554: Модель выделенного распределителя (Rev 2)" (Pablo Halpern, 2008-02-29) для обратного переноса модели выделенного распределителя на C++03, поскольку в C++03 нет механизма для обнаружения, может ли тип быть построен из произвольных аргументов. Приложения, нацеленные на переносимость с несколькими компиляторами, всегда должны определять эту черту.
В соответствии с компиляторами C++11 или компиляторами, поддерживающими выражения SFINAE (когда BOOST_NO_SFINAE_EXPR НЕ определен), эта черта игнорируется, и правила C++11 будут использоваться для определения того, должен ли тип быть построен с аргументами суффикса или префикса распределителя.