Description
Замечание: если конструируемая специализация_with_allocator_suffix:: значение истинно, указывает на то, что T может быть построен с помощью распределителя в качестве последнего аргумента конструктора. В идеале все конструкторы T (включая конструкторы копирования и перемещения) должны иметь вариант, который принимает окончательный аргумент типа allocator_type.
Требуется: если конструируемая специализация_with_allocator_suffix:: значение истинно, T должна иметь вложенный тип, allocator_type и по меньшей мере один конструктор, для которого allocator_type является последним параметром. Если не все конструкторы T могут быть вызваны с окончательным аргументом типа allocator_type, и если T используется в контексте, где контейнер должен вызвать такого конструктора, то программа плохо сформирована.
<template <class T, class Allocator = allocator<T> > class Z { public: typedef Allocator allocator_type;
>
<// Default constructor with optional allocator suffix Z(const allocator_type& a = allocator_type());
>
<// Copy constructor and allocator-extended copy constructor Z(const Z& zz); Z(const Z& zz, const allocator_type& a); };
>
<// Specialize trait for class template Z template <class T, class Allocator = allocator<T> > structconstructible_with_allocator_suffix<Z<T,Allocator> > { static const bool value = true; };
>
Примечание: Эта черта является обходным путем, вдохновленным "N2554: Модель со скобками (Rev 2)" (Пабло Гальперн, 2008-02-29) для обратного переноса модели с масштабируемым распределением на C++03, поскольку в C++03 нет механизма для обнаружения, может ли тип быть построен из произвольных аргументов. Приложения, нацеленные на переносимость с несколькими компиляторами, всегда должны определять эту черту.
В соответствии с компиляторами C++11 или компиляторами, поддерживающими выражения SFINAE (когда BOOST_NO_SFINAE_EXPR НЕ определен), эта черта игнорируется, и правила C++11 будут использоваться для определения того, должен ли тип быть построен с аргументами суффикса или префикса распределителя.