В этом разделе описаны функции стандарта C ++, которые указаны для совместимости с существующими реализациями.
Это устаревшие функции, которые deprecated определены как: Нормативные для текущей редакции этого международного стандарта, но были определены как кандидаты на удаление из будущих редакций. Реализация может объявлять имена библиотек и сущности, описанные в этом разделе, с расширением deprecated attribute.
Для совместимости с предыдущими международными стандартами C ++ constexpr статический член данных может быть повторно объявлен вне класса без инициализатора. Это использование не рекомендуется. [ Example:
struct A { static constexpr int n = 5; // definition (declaration in C++ 2014) }; constexpr int A::n; // redundant declaration (definition in C++ 2014)
— end example ]
Неявное определение конструктора копирования по умолчанию считается устаревшим, если в классе есть объявленный пользователем оператор присваивания копии или объявленный пользователем деструктор. Неявное определение оператора присваивания копии по умолчанию считается устаревшим, если в классе есть объявленный пользователем конструктор копирования или объявленный пользователем деструктор ([class.dtor], [class.copy]). В будущей редакции этого международного стандарта эти неявные определения могут быть удалены ([dcl.fct.def]).
Для совместимости с предыдущими международными стандартами C ++ стандартная библиотека C ++ предоставляет заголовки <ccomplex> ([depr.ccomplex.syn]), <cstdalign> ([depr.cstdalign.syn]), <cstdbool> ([depr.cstdbool.syn]) и <ctgmath> ([depr.ctgmath.syn]). Использование этих заголовков не рекомендуется.
#include <complex>
Заголовок <ccomplex> ведет себя так, как будто он просто включает заголовок <complex> ([complex.syn]).
#define __alignas_is_defined 1
#define __bool_true_false_are_defined 1
#include <complex> #include <cmath>
Для совместимости со стандартной библиотекой C стандартная библиотека C ++ предоставляет, как C headers показано в таблице 141.
<assert.h> | <inttypes.h> | <signal.h> | <stdio.h> | <wchar.h> |
<complex.h> | <iso646.h> | <stdalign.h> | <stdlib.h> | <wctype.h> |
<ctype.h> | <limits.h> | <stdarg.h> | <string.h> | |
<errno.h> | <locale.h> | <stdbool.h> | <tgmath.h> | |
<fenv.h> | <math.h> | <stddef.h> | <time.h> | |
<float.h> | <setjmp.h> | <stdint.h> | <uchar.h> |
Заголовок <complex.h> ведет себя так, как будто он просто включает заголовок <ccomplex>. Заголовок <tgmath.h> ведет себя так, как будто он просто включает заголовок <ctgmath>.
Каждый другой заголовок C, каждый из которых имеет имя формы name.h, ведет себя так, как если бы каждое имя, помещенное в пространство имен стандартной библиотеки соответствующим cname заголовком, помещалось в область глобального пространства имен, за исключением функций, описанных в [sf.cmath]объявлении std::byte ([cstddef.syn]) , а также функции и шаблоны функций, описанные в [support.types.byteops]. Не указано, были ли эти имена сначала объявлены или определены в области видимости пространства имен ([basic.scope.namespace]) пространства имен, std а затем явно введены в глобальную область пространства имен using-declarations.
[ Example: Заголовок, несомненно, предоставляет свои объявления и определения в пространстве имен . Он также может предоставлять эти имена в глобальном пространстве имен. Заголовок, несомненно, предоставляет те же объявления и определения в глобальном пространстве имен, как и в стандарте C. Он также может предоставлять эти имена в пространстве имен . ]<cstdlib> std<stdlib.h> std — end example
Заголовок определяет три типа, которые связывают буферы потока с объектами символьного массива и помогают читать и записывать такие объекты.<strstream>
namespace std { class strstreambuf : public basic_streambuf<char> { public: explicit strstreambuf(streamsize alsize_arg = 0); strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*)); strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0); strstreambuf(const char* gnext_arg, streamsize n); strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = 0); strstreambuf(const signed char* gnext_arg, streamsize n); strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = 0); strstreambuf(const unsigned char* gnext_arg, streamsize n); virtual ~strstreambuf(); void freeze(bool freezefl = true); char* str(); int pcount(); protected: int_type overflow (int_type c = EOF) override; int_type pbackfail(int_type c = EOF) override; int_type underflow() override; pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out) override; streambuf* setbuf(char* s, streamsize n) override; private: using strstate = T1; // exposition only static const strstate allocated; // exposition only static const strstate constant; // exposition only static const strstate dynamic; // exposition only static const strstate frozen; // exposition only strstate strmode; // exposition only streamsize alsize; // exposition only void* (*palloc)(size_t); // exposition only void (*pfree)(void*); // exposition only }; }
Класс strstreambuf связывает входную последовательность и, возможно, выходную последовательность с объектом некоторого character типа массива, элементы которого хранят произвольные значения. У объекта массива есть несколько атрибутов.
[ Note: Для наглядности они представлены как элементы типа битовой маски (обозначены здесь как T1) с именем strstate. Элементами являются:
allocated, устанавливается, когда объект динамического массива был выделен и, следовательно, должен быть освобожден деструктором этого strstreambuf объекта;
constant, устанавливается, когда объект массива имеет const элементы, поэтому выходная последовательность не может быть записана;
dynamic, устанавливается, когда объект массива выделяется (или перераспределяется) по мере необходимости для хранения последовательности символов, длина которой может изменяться;
frozen, устанавливается, когда программа запросила, чтобы объект массива не был изменен, перераспределен или освобожден.
— end note ]
[ Note: Для демонстрации поддерживаемые данные представлены здесь как:
strstate strmode, атрибуты объекта массива, связанные с strstreambuf объектом;
int alsize, рекомендуемый минимальный размер объекта динамического массива;
void* (*palloc)(size_t), указывает на функцию, которую нужно вызвать для выделения объекта динамического массива;
void (*pfree)(void*), указывает на функцию, вызываемую для освобождения объекта динамического массива.
— end note ]
Каждый объект класса strstreambuf имеет seekable area, разделенный указателями seeklow и seekhigh. Если gnext это нулевой указатель, область поиска не определена. В противном случае seeklow равно gbeg и seekhigh равно либо pend, если pend не является нулевым указателем, либо gend.
explicit strstreambuf(streamsize alsize_arg = 0);
Элемент | Ценить |
strmode | dynamic |
alsize | alsize_arg |
palloc | нулевой указатель |
pfree | нулевой указатель |
strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));
Effects: Создает объект класса strstreambuf, инициализируя базовый класс с помощью streambuf(). Постусловия этой функции указаны в таблице 143.
Элемент | Ценить |
strmode | dynamic |
alsize | неуказанное значение |
palloc | palloc_arg |
pfree | pfree_arg |
strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0);
strstreambuf(signed char* gnext_arg, streamsize n,
signed char* pbeg_arg = 0);
strstreambuf(unsigned char* gnext_arg, streamsize n,
unsigned char* pbeg_arg = 0);
Effects: Создает объект класса strstreambuf, инициализируя базовый класс с помощью streambuf(). Постусловия этой функции указаны в таблице 144.
Элемент | Ценить |
strmode | 0 |
alsize | неуказанное значение |
palloc | нулевой указатель |
pfree | нулевой указатель |
В противном случае функция выполняет:
setg(gnext_arg, gnext_arg, pbeg_arg); setp(pbeg_arg, pbeg_arg + N);
strstreambuf(const char* gnext_arg, streamsize n);
strstreambuf(const signed char* gnext_arg, streamsize n);
strstreambuf(const unsigned char* gnext_arg, streamsize n);
Effects: Ведет же , как strstreambuf((char*)gnext_arg,n), за исключением того, что конструктор также устанавливает constant в strmode.
virtual ~strstreambuf();
Effects: Уничтожает объект класса strstreambuf. Функция освобождает динамически выделенный объект массива, только если (strmode & allocated) != 0 и (strmode & frozen) == 0. ([depr.strstreambuf.virtuals] описывает, как освобождается динамически выделенный объект массива.)
void freeze(bool freezefl = true);
char* str();
Effects: Вызывает freeze(), а затем возвращает начальный указатель для входной последовательности gbeg.
int pcount() const;
int_type overflow(int_type c = EOF) override;
Effects: Добавляет символ, обозначенный значком, c к выходной последовательности, если возможно, одним из двух способов:
Если c != EOF и если либо выходная последовательность имеет позицию записи доступны или функция делает позицию записи доступную (как описано ниже), назначает c для *pnext++.
Возврат (unsigned char)c.
Если c == EOFнет символа для добавления.
Возвращает значение, отличное от EOF.
Чтобы сделать позицию записи доступной, функция перераспределяет (или первоначально выделяет) объект массива с достаточным количеством элементов, n чтобы удерживать текущий объект массива (если есть), плюс по крайней мере одну дополнительную позицию записи. В противном случае не указывается, сколько дополнительных позиций записи доступно. 332 Если palloc это не нулевой указатель, функция вызывает (*palloc)(n) выделение нового объекта динамического массива. В противном случае он оценивает выражение new charT[n]. В любом случае, если выделение не удалось, функция вернется EOF. В противном случае, он устанавливает allocated в strmode.
Чтобы освободить ранее существовавший объект динамического массива, адрес первого элемента которого p: Если pfree не является нулевым указателем, функция вызывает (*pfree)(p). В противном случае он оценивает выражение delete[]p.
Если (strmode & dynamic) == 0или если (strmode & frozen) != 0функция не может расширить массив (перераспределить его на большую длину), чтобы сделать доступной позицию для записи.
int_type pbackfail(int_type c = EOF) override;
Возвращает символ, обозначенный значком, c во входную последовательность, если это возможно, одним из трех способов:
Если c != EOF, если входная последовательность имеет место Putback доступный, и если (char)c == gnext[-1], правопреемники gnext - 1 в gnext.
Возврат c.
Если c != EOF, если входная последовательность имеет позицию Putback доступный, и если strmode & constant равна нулю, правопреемников c к *--gnext.
Возврат c.
Если c == EOF и , если входная последовательность имеет место Putback доступный, правопреемники gnext - 1 к gnext.
Возвращает значение, отличное от EOF.
int_type underflow() override;
Effects: Считывает символ из input sequence, если это возможно, не перемещая позицию потока мимо него, как показано ниже:
Если входная последовательность имеет доступную позицию чтения, функция сигнализирует об успехе, возвращаясь (unsigned char)*gnext.
В противном случае, если текущий указатель на следующую запись pnext не является нулевым указателем и больше, чем текущий указатель конца чтения gend, делает read position доступным, присваивая gend значение больше gnext и не больше pnext.
Возврат (unsigned char)*gnext.
pos_type seekoff(off_type off, seekdir way, openmode which = in | out) override;
Effects: Если возможно, изменяет положение потока в одной из управляемых последовательностей, как указано в Табл 145.
Условия | Результат |
(which & ios::in) != 0 | позиционирует входную последовательность |
(which & ios::out) != 0 | позиционирует выходную последовательность |
(which & (ios::in | ios::out)) == (ios::in | ios::out)) и way == либо, ios::beg либо ios::end | позиционирует как входную, так и выходную последовательности |
Иначе | операция позиционирования не выполняется. |
Для позиционирования последовательности, если ее следующий указатель является нулевым указателем, операция позиционирования завершается ошибкой. В противном случае функция определяет, newoff как указано в таблице 146.
Состояние | newoff Ценить |
way == ios::beg | 0 |
way == ios::cur | следующий указатель минус указатель начала (xnext - xbeg). |
way == ios::end | seekhigh минус начальный указатель (seekhigh - xbeg). |
Если (newoff + off) < (seeklow - xbeg) или (seekhigh - xbeg) < (newoff + off), операция позиционирования не выполняется. В противном случае функция присваивает xbeg + newoff + off следующий указатель xnext.
Returns: pos_type(newoff), построенный из результирующего смещения newoff (типа off_type), в котором, если возможно, сохраняется позиция результирующего потока. Если операция позиционирования завершается неудачно, или если сконструированный объект не может представлять позицию результирующего потока, возвращается значение pos_type(off_type(-1)).
pos_type seekpos(pos_type sp, ios_base::openmode which
= ios_base::in | ios_base::out) override;
Effects: Изменяет позицию потока в одной из управляемых последовательностей, если это возможно, чтобы соответствовать позиции потока, сохраненной в sp (как описано ниже).
Если (which & ios::in) != 0, позиционирует входную последовательность.
Если (which & ios::out) != 0, позиционирует выходную последовательность.
Если функция не позиционирует ни одну последовательность, операция позиционирования не выполняется.
Для позиционирования последовательности, если ее следующий указатель является нулевым указателем, операция позиционирования завершается ошибкой. В противном случае функция определяет newoff из sp.offset():
Если newoff это недопустимая позиция в потоке, имеет отрицательное значение или значение больше (seekhigh - seeklow), операция позиционирования не выполняется.
В противном случае функция добавляет newoff к начальному указателю xbeg и сохраняет результат в следующем указателе xnext.
Returns: pos_type(newoff), построенный из результирующего смещения newoff (типа off_type), в котором, если возможно, сохраняется позиция результирующего потока. Если операция позиционирования завершается неудачно, или если сконструированный объект не может представлять позицию результирующего потока, возвращается значение pos_type(off_type(-1)).
streambuf<char>* setbuf(char* s, streamsize n) override;
При alsize принятии этого решения следует учитывать реализацию .
namespace std {
class istrstream : public basic_istream<char> {
public:
explicit istrstream(const char* s);
explicit istrstream(char* s);
istrstream(const char* s, streamsize n);
istrstream(char* s, streamsize n);
virtual ~istrstream();
strstreambuf* rdbuf() const;
char* str();
private:
strstreambuf sb; // exposition only
};
}
Класс istrstream поддерживает чтение объектов класса strstreambuf. Он предоставляет strstreambuf объект для управления связанным объектом массива. Для демонстрации поддерживаемые данные представлены здесь как:
sb, strstreambuf объект.
explicit istrstream(const char* s);
explicit istrstream(char* s);
istrstream(const char* s, streamsize n);
istrstream(char* s, streamsize n);
namespace std {
class ostrstream : public basic_ostream<char> {
public:
ostrstream();
ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);
virtual ~ostrstream();
strstreambuf* rdbuf() const;
void freeze(bool freezefl = true);
char* str();
int pcount() const;
private:
strstreambuf sb; // exposition only
};
}
Класс ostrstream поддерживает запись объектов класса strstreambuf. Он предоставляет strstreambuf объект для управления связанным объектом массива. Для демонстрации поддерживаемые данные представлены здесь как:
sb, strstreambuf объект.
ostrstream();
Effects: Создает объект класса ostrstream, инициализируя базовый класс ostream(&sb) и инициализируя sb с помощью strstreambuf().
ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out);
Effects: Создает объект класса ostrstream, инициализируя базовый класс ostream(&sb)и инициализируя sb одним из двух конструкторов:
Если (mode & app) == 0, то s обозначает первый элемент массива n элементов.
Конструктор есть strstreambuf(s, n, s).
Если (mode & app) != 0, то s должен обозначить первый элемент массива n элементов, который содержит ntbs , первый элемент которого обозначен s. Конструктор есть strstreambuf(s, n, s + std::strlen(s)).333
namespace std { class strstream : public basic_iostream<char> { public: // Types using char_type = char; using int_type = char_traits<char>::int_type; using pos_type = char_traits<char>::pos_type; using off_type = char_traits<char>::off_type; // constructors/destructor strstream(); strstream(char* s, int n, ios_base::openmode mode = ios_base::in|ios_base::out); virtual ~strstream(); // Members: strstreambuf* rdbuf() const; void freeze(bool freezefl = true); int pcount() const; char* str(); private: strstreambuf sb; // exposition only }; }
Класс strstream поддерживает чтение и запись из объектов класса strstreambuf. Он предоставляет strstreambuf объект для управления связанным объектом массива. Для демонстрации поддерживаемые данные представлены здесь как:
sb, strstreambuf объект.
strstream();
strstream(char* s, int n,
ios_base::openmode mode = ios_base::in|ios_base::out);
Effects: Создает объект класса strstream, инициализируя базовый класс iostream(&sb) и инициализируя sb одним из двух конструкторов:
Если (mode & app) == 0, то s обозначает первый элемент массива n элементов. Конструктор есть strstreambuf(s,n,s).
Если (mode & app) != 0, то s должен обозначить первый элемент массива n элементов, который содержит ntbs , первый элемент которого обозначен s. Конструктор есть strstreambuf(s,n,s + std::strlen(s)).
virtual ~strstream();
bool uncaught_exception() noexcept;
А call wrapper может иметь weak result type. Если это так, тип его типа члена result_type основан на типе T целевого объекта оболочки:
если T - указатель на тип функции, result_type должен быть синонимом возвращаемого типа T;
если T - указатель на функцию-член, result_type должен быть синонимом возвращаемого типа T;
если T это тип класса, а qualified-id T::result_type действительный и обозначает тип ([temp.deduct]), то result_type должен быть синонимом для T::result_type;
иначе result_type не определяется.
Чтобы включить старые функции адаптеров для управления объектами функции , которые принимают один или два аргумент, многие из функциональных объектов в настоящем стандарте , соответственно , обеспечивают typedef-names argument_type и result_type для функциональных объектов , которые принимают один аргумент и first_argument_type, second_argument_typeи result_type для функциональных объектов , которые принимают два аргумента.
Следующие имена членов определены в дополнение к именам, указанным в Пункте [function.objects]:
namespace std { template<class T> struct owner_less<shared_ptr<T>> { using result_type = bool; using first_argument_type = shared_ptr<T>; using second_argument_type = shared_ptr<T>; }; template<class T> struct owner_less<weak_ptr<T>> { using result_type = bool; using first_argument_type = weak_ptr<T>; using second_argument_type = weak_ptr<T>; }; template <class T> class reference_wrapper { public : using result_type = see below; // not always defined using argument_type = see below; // not always defined using first_argument_type = see below; // not always defined using second_argument_type = see below; // not always defined }; template <class T> struct plus { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct minus { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct multiplies { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct divides { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct modulus { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct negate { using argument_type = T; using result_type = T; }; template <class T> struct equal_to { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct not_equal_to { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct greater { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct less { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct greater_equal { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct less_equal { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct logical_and { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct logical_or { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct logical_not { using argument_type = T; using result_type = bool; }; template <class T> struct bit_and { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct bit_or { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct bit_xor { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct bit_not { using argument_type = T; using result_type = T; }; template<class R, class T1> class function<R(T1)> { public: using argument_type = T1; }; template<class R, class T1, class T2> class function<R(T1, T2)> { public: using first_argument_type = T1; using second_argument_type = T2; }; }
reference_wrapper<T> имеет weak result type. Если T - это тип функции, result_type должен быть синонимом возвращаемого типа T.
Специализация шаблона reference_wrapper<T> должна определять вложенный тип, названный argument_type как синоним, T1 только если тип T является одним из следующих:
тип функции или указатель на тип функции, принимающий один аргумент типа T1
указатель на функцию-член R T0::f() cv (где cv представляет cv-квалификаторы функции-члена); тип T1 это cv T0*
тип класса, где qualified-id T::argument_type допустим и обозначает тип ([temp.deduct]); тип T1 есть T::argument_type.
Создание экземпляра шаблона reference_wrapper<T> должно определять два вложенных типа с именами first_argument_type и second_argument_type как синонимы для T1 и T2, соответственно, только если тип T является одним из следующих:
тип функции или указатель на тип функции, принимающий два аргумента типа T1 и T2
указатель на функцию-член R T0::f(T2) cv (где cv представляет cv-квалификаторы функции-члена); тип T1 это cv T0*
тип класса , где qualified-ids T::first_argument_type и T::second_argument_type являются действительными и оба типа обозначают ([temp.deduct]); тип T1 есть T::first_argument_type и тип T2 есть T::second_argument_type.
Все включенные специализации hash<Key> из hash ([unord.hash]) обеспечивают два вложенных типов, result_type и argument_type, которые должны быть синонимы size_t и Key, соответственно.
Обертка переадресации вызовов, g возвращаемая вызовом bind(f, bound_args...) ([func.bind.bind]), должна иметь weak result type.
Обертка переадресации вызова, g возвращаемая вызовом bind<R>(f, bound_args...) ([func.bind.bind]), должна иметь вложенный тип, result_type определенный как синоним для R.
Простая оболочка вызова, возвращаемая из вызова, mem_fn(pm) должна иметь вложенный тип, result_type который является синонимом возвращаемого типа, pm когда pm является указателем на функцию-член.
Простая оболочка вызова, возвращаемая при вызове, mem_fn(pm) должна определять два вложенных типа с именами argument_type и result_type как синонимы для cv T* и Ret, соответственно, когда pm является указателем на функцию-член с квалификатором cv cv и не принимает аргументов, где Ret - pmтип возвращаемого значения.
Простая оболочка вызова, возвращаемая из вызова, mem_fn(pm) должна определять три вложенных типа с именами first_argument_type, second_argument_typeи result_type как синонимы для cv T*, T1и Ret, соответственно, когда pm является указателем на функцию-член с квалификатором cv cv и принимает один аргумент типа T1, где Ret - pmэто return тип.
Следующие имена членов определены в дополнение к именам, указанным в Пункте [containers]:
namespace std { template <class Key, class T, class Compare, class Allocator> class map<Key, T, Compare, Allocator>::value_compare { public: using result_type = bool; using first_argument_type = value_type; using second_argument_type = value_type; }; template <class Key, class T, class Compare, class Allocator> class multimap<Key, T, Compare, Allocator>::value_compare { public: using result_type = bool; using first_argument_type = value_type; using second_argument_type = value_type; }; }
В шапку внесены следующие дополнения:<functional>
namespace std { template <class Predicate> class unary_negate; template <class Predicate> constexpr unary_negate<Predicate> not1(const Predicate&); template <class Predicate> class binary_negate; template <class Predicate> constexpr binary_negate<Predicate> not2(const Predicate&); }
Отрицатели not1 и not2 принимают унарный и бинарный предикаты соответственно и возвращают их логические отрицания ([expr.unary.op]).
template <class Predicate> class unary_negate { public: constexpr explicit unary_negate(const Predicate& pred); constexpr bool operator()(const typename Predicate::argument_type& x) const; using argument_type = typename Predicate::argument_type; using result_type = bool; };
constexpr bool operator()(const typename Predicate::argument_type& x) const;
template <class Predicate>
constexpr unary_negate<Predicate> not1(const Predicate& pred);
template <class Predicate> class binary_negate { public: constexpr explicit binary_negate(const Predicate& pred); constexpr bool operator()(const typename Predicate::first_argument_type& x, const typename Predicate::second_argument_type& y) const; using first_argument_type = typename Predicate::first_argument_type; using second_argument_type = typename Predicate::second_argument_type; using result_type = bool; };
constexpr bool operator()(const typename Predicate::first_argument_type& x,
const typename Predicate::second_argument_type& y) const;
template <class Predicate>
constexpr binary_negate<Predicate> not2(const Predicate& pred);
Следующие члены и явная специализация шаблона класса определены в дополнение к тем, которые указаны в [default.allocator]:
namespace std { // specialize for void: template <> class allocator<void> { public: using value_type = void; using pointer = void*; using const_pointer = const void*; // reference-to-void members are impossible. template <class U> struct rebind { using other = allocator<U>; }; }; template <class T> class allocator { public: using size_type = size_t; using difference_type = ptrdiff_t; using pointer = T*; using const_pointer = const T*; using reference = T&; using const_reference = const T&; template <class U> struct rebind { using other = allocator<U>; }; T* address(T& x) const noexcept; const T* address(const T& x) const noexcept; T* allocate(size_t n, const void* hint); template<class U, class... Args> void construct(U* p, Args&&... args); template <class U> void destroy(U* p); size_t max_size() const noexcept; }; }
T* address(T& x) const noexcept;
const T* address(const T& x) const noexcept;
T* allocate(size_t n, const void* hint);
Returns: Указатель на начальный элемент массива хранения размера n * sizeof(T), выровненный соответствующим образом для объектов типа T. Поддерживаются ли избыточно выровненные типы, зависит от реализации ([basic.align]).
Remarks: Хранилище получается с помощью вызова ::operator new(std::size_t) ([new.delete]), но не указано, когда и как часто вызывается эта функция.
template <class U, class... Args>
void construct(U* p, Args&&... args);
template <class U>
void destroy(U* p);
size_t max_size() const noexcept;
В шапке есть следующее дополнение:<memory>
namespace std { template <class OutputIterator, class T> class raw_storage_iterator { public: using iterator_category = output_iterator_tag; using value_type = void; using difference_type = void; using pointer = void; using reference = void; explicit raw_storage_iterator(OutputIterator x); raw_storage_iterator& operator*(); raw_storage_iterator& operator=(const T& element); raw_storage_iterator& operator=(T&& element); raw_storage_iterator& operator++(); raw_storage_iterator operator++(int); OutputIterator base() const; }; }
raw_storage_iterator предоставляется для того, чтобы алгоритмы могли сохранять свои результаты в неинициализированной памяти. Параметр шаблона OutputIterator должен operator* возвращать объект, для которого operator& определен и возвращает указатель T, а также требуется для удовлетворения требований output iterator.
explicit raw_storage_iterator(OutputIterator x);
Effects: Инициализирует итератор так, чтобы он указывал на то же значение, на которое x указывает.
raw_storage_iterator& operator*();
raw_storage_iterator& operator=(const T& element);
raw_storage_iterator& operator=(T&& element);
raw_storage_iterator& operator++();
Effects: Предварительное приращение: продвигает итератор вперед и возвращает ссылку на обновленный итератор.
raw_storage_iterator operator++(int);
OutputIterator base() const;
В шапку внесены следующие дополнения:<memory>
namespace std { template <class T> pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; template <class T> void return_temporary_buffer(T* p); }
template <class T>
pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept;
Effects: Получает указатель на неинициализированное непрерывное хранилище для N смежных объектов типа Tдля некоторого неотрицательного числа N. Поддерживаются ли избыточно выровненные типы, зависит от реализации ([basic.align]).
Remarks: Вызов get_temporary_buffer с положительным числом n - это необязательный запрос на возврат хранилища для n объектов типа T. В этом случае реализации разрешается вместо этого возвращать хранилище для неотрицательного числа N таких объектов, где N != n (включая N == 0). [ Note: Запрос не является обязывающим, чтобы предоставить свободу для оптимизации управления памятью в зависимости от реализации. ] — end note
Returns: Если n <= 0 или если не удалось получить хранилище, возвращает пару P , которая P.first является значением нулевого указателя и P.second == 0; в противном случае возвращает пару P , которая P.first ссылается на адрес неинициализированного хранилища и P.second ссылается на его емкость N (в единицах sizeof(T)).
template <class T> void return_temporary_buffer(T* p);
Requires: p должен быть значением указателя, возвращенным более ранним вызовом get_temporary_buffer , который не был признан недействительным в результате промежуточного вызова return_temporary_buffer(T*).
В шапке есть следующее дополнение:<type_traits>
namespace std {
template <class T> struct is_literal_type;
template <class T> constexpr bool is_literal_type_v = is_literal_type<T>::value;
template <class> struct result_of; // not defined
template <class Fn, class... ArgTypes> struct result_of<Fn(ArgTypes...)>;
template <class T> using result_of_t = typename result_of<T>::type;
}
Requires: Для is_literal_type, remove_all_extents_t<T> должен быть полный тип или cv void. For result_of<Fn(ArgTypes...)>, Fn и все типы в пакете параметров ArgTypes должны быть полными типами cv voidили массивами с неизвестной границей.
is_literal_type<T> является a UnaryTypeTrait ([meta.rqmts]) с базовой характеристикой true_type if T is a literal type, и в false_type противном случае. Частичная специализация result_of<Fn(ArgTypes...)> - это TransformationTrait тип, член type которого определен тогда и только тогда, когда invoke_result<Fn, ArgTypes...>::type он определен. Если type определен, он называет тот же тип, что и invoke_result_t<Fn, ArgTypes...>.
В шапке есть следующее дополнение:<iterator>
namespace std { template<class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&> struct iterator { using iterator_category = Category; using value_type = T; using difference_type = Distance; using pointer = Pointer; using reference = Reference; }; }
iterator Шаблон может быть использован в качестве базового класса , чтобы облегчить определение необходимых типов для новых итераторов.
[ Note: Если новый тип итератора является шаблоном класса, то эти псевдонимы не будут видны из определения шаблона класса итератора, а будут видны только вызывающим объектам этого класса. ] — end note
[ Example: Если программа на C ++ хочет определить двунаправленный итератор для некоторой структуры данных, содержащей double и такой, чтобы она работала на большой модели памяти реализации, она может сделать это с помощью:
class MyIterator :
public iterator<bidirectional_iterator_tag, double, long, T*, T&> {
// code implementing ++, etc.
};
— end example ]
namespace std { enum codecvt_mode { consume_header = 4, generate_header = 2, little_endian = 1 }; template <class Elem, unsigned long Maxcode = 0x10ffff, codecvt_mode Mode = (codecvt_mode)0> class codecvt_utf8 : public codecvt<Elem, char, mbstate_t> { public: explicit codecvt_utf8(size_t refs = 0); ~codecvt_utf8(); }; template <class Elem, unsigned long Maxcode = 0x10ffff, codecvt_mode Mode = (codecvt_mode)0> class codecvt_utf16 : public codecvt<Elem, char, mbstate_t> { public: explicit codecvt_utf16(size_t refs = 0); ~codecvt_utf16(); }; template <class Elem, unsigned long Maxcode = 0x10ffff, codecvt_mode Mode = (codecvt_mode)0> class codecvt_utf8_utf16 : public codecvt<Elem, char, mbstate_t> { public: explicit codecvt_utf8_utf16(size_t refs = 0); ~codecvt_utf8_utf16(); }; }
Для каждого из трех аспектов преобразования кода codecvt_utf8, codecvt_utf16и codecvt_utf8_utf16:
Elem тип широких символов, например wchar_t, char16_tили char32_t.
Maxcode - это самый большой код с широкими символами, который фасет будет читать или писать без сообщения об ошибке преобразования.
Если (Mode & consume_header), то при чтении многобайтовой последовательности фасет должен использовать начальную последовательность заголовка, если она присутствует, для определения порядка следования байтов последующей многобайтовой последовательности, которая должна быть прочитана.
Если (Mode & generate_header), фасет должен генерировать начальную последовательность заголовка при записи многобайтовой последовательности, чтобы объявить о порядке следования записываемой последующей многобайтовой последовательности.
Если (Mode & little_endian), фасет должен генерировать многобайтовую последовательность в обратном порядке, в отличие от стандартного обратного порядка байтов.
Фасет должен преобразовывать многобайтовые последовательности UTF-8 в UCS2 или UCS4 (в зависимости от размера Elem) в программе.
Порядок байтов не влияет на то, как читаются или записываются многобайтовые последовательности.
Многобайтовые последовательности могут быть записаны в виде текстового или двоичного файла.
Фасет должен преобразовывать многобайтовые последовательности UTF-16 в UCS2 или UCS4 (в зависимости от размера Elem) в программе.
Многобайтовые последовательности должны читаться или записываться в соответствии с указанным выше Mode флагом.
Многобайтовые последовательности могут быть записаны только как двоичный файл. Попытка записи в текстовый файл приводит к неопределенному поведению.
Для грани : codecvt_utf8_utf16
Фасет должен преобразовывать многобайтовые последовательности UTF-8 в UTF-16 (один или два 16-битных кода) в программе.
Порядок байтов не влияет на то, как читаются или записываются многобайтовые последовательности.
Многобайтовые последовательности могут быть записаны в виде текстового или двоичного файла.
См. Также: ISO / IEC 10646-1: 1993.
В шапку <locale> внесены следующие дополнения:
namespace std { template <class Codecvt, class Elem = wchar_t, class Wide_alloc = allocator<Elem>, class Byte_alloc = allocator<char>> class wstring_convert; template <class Codecvt, class Elem = wchar_t, class Tr = char_traits<Elem>> class wbuffer_convert; }
Шаблон класса wstring_convert выполняет преобразования между широкой строкой и байтовой строкой. Он позволяет указать фасет преобразования кода (например, шаблон класса codecvt) для выполнения преобразований, не затрагивая какие-либо потоки или языковые стандарты. [ Example: Если вы хотите использовать фасет преобразования кода codecvt_utf8 для вывода в cout многобайтовую последовательность UTF-8, соответствующую широкой строке, но вы не хотите изменять языковой стандарт cout, вы можете написать что-то вроде:
wstring_convert<std::codecvt_utf8<wchar_t>> myconv; std::string mbstring = myconv.to_bytes(L"Hello\n"); std::cout << mbstring;
— end example ]
namespace std { template <class Codecvt, class Elem = wchar_t, class Wide_alloc = allocator<Elem>, class Byte_alloc = allocator<char>> class wstring_convert { public: using byte_string = basic_string<char, char_traits<char>, Byte_alloc>; using wide_string = basic_string<Elem, char_traits<Elem>, Wide_alloc>; using state_type = typename Codecvt::state_type; using int_type = typename wide_string::traits_type::int_type; explicit wstring_convert(Codecvt* pcvt = new Codecvt); wstring_convert(Codecvt* pcvt, state_type state); explicit wstring_convert(const byte_string& byte_err, const wide_string& wide_err = wide_string()); ~wstring_convert(); wstring_convert(const wstring_convert&) = delete; wstring_convert& operator=(const wstring_convert&) = delete; wide_string from_bytes(char byte); wide_string from_bytes(const char* ptr); wide_string from_bytes(const byte_string& str); wide_string from_bytes(const char* first, const char* last); byte_string to_bytes(Elem wchar); byte_string to_bytes(const Elem* wptr); byte_string to_bytes(const wide_string& wstr); byte_string to_bytes(const Elem* first, const Elem* last); size_t converted() const noexcept; state_type state() const; private: byte_string byte_err_string; // exposition only wide_string wide_err_string; // exposition only Codecvt* cvtptr; // exposition only state_type cvtstate; // exposition only size_t cvtcount; // exposition only }; }
Шаблон класса описывает объект, который управляет преобразованиями между объектами широких строк класса basic_string<Elem, char_traits<Elem>, Wide_alloc> и объектами байтовых строк класса basic_string<char, char_traits<char>, Byte_alloc>. Шаблон класса определяет типы wide_string и byte_string как синонимы для этих двух типов. Преобразование между последовательностью Elem значений (хранящейся в wide_string объекте) и многобайтовыми последовательностями (хранящейся в byte_string объекте) выполняется объектом класса Codecvt, который соответствует требованиям стандартного аспекта преобразования кода codecvt<Elem, char, mbstate_t>.
В объекте этого шаблона класса хранятся:
byte_err_string - строка байтов для отображения при ошибках
wide_err_string - широкая строка для отображения при ошибках
cvtptr - указатель на выделенный объект преобразования (который освобождается при wstring_convert уничтожении объекта)
cvtstate - объект состояния преобразования
cvtcount - счетчик конверсий
using byte_string = basic_string<char, char_traits<char>, Byte_alloc>;
size_t converted() const noexcept;
wide_string from_bytes(char byte);
wide_string from_bytes(const char* ptr);
wide_string from_bytes(const byte_string& str);
wide_string from_bytes(const char* first, const char* last);
Effects: Первая функция-член должна преобразовывать одноэлементную последовательность byte в широкую строку. Вторая функция-член должна преобразовать последовательность с завершающим нулем, начинающуюся ptr с, в широкую строку. Третья функция-член должна преобразовать сохраненную последовательность в str широкую строку. Четвертая функция-член должна преобразовывать последовательность, определенную диапазоном, [first, last) в широкую строку.
В любом случае:
Если cvtstate объект не был создан с явным значением, ему должно быть присвоено значение по умолчанию (начальное состояние преобразования) до начала преобразования. В противном случае оставить без изменений.
Количество успешно преобразованных входных элементов должно быть сохранено в cvtcount.
Returns: Если ошибки преобразования не возникает, функция-член должна возвращать преобразованную широкую строку. В противном случае, если объект был построен с использованием строки с расширенной ошибкой, функция-член должна возвращать строку с расширенной ошибкой. В противном случае функция-член создает объект класса range_error.
using int_type = typename wide_string::traits_type::int_type;
state_type state() const;
using state_type = typename Codecvt::state_type;
byte_string to_bytes(Elem wchar);
byte_string to_bytes(const Elem* wptr);
byte_string to_bytes(const wide_string& wstr);
byte_string to_bytes(const Elem* first, const Elem* last);
Effects: Первая функция-член должна преобразовывать одноэлементную последовательность wchar в байтовую строку. Вторая функция-член должна преобразовать последовательность с завершающим нулем, начинающуюся wptr с, в байтовую строку. Третья функция-член должна преобразовать сохраненную последовательность в wstr байтовую строку. Четвертая функция-член должна преобразовывать последовательность, определенную диапазоном, [first, last) в байтовую строку.
В любом случае:
Если cvtstate объект не был создан с явным значением, ему должно быть присвоено значение по умолчанию (начальное состояние преобразования) до начала преобразования. В противном случае оставить без изменений.
Количество успешно преобразованных входных элементов должно быть сохранено в cvtcount.
Returns: Если ошибки преобразования не возникает, функция-член должна возвращать преобразованную байтовую строку. В противном случае, если объект был построен со строкой байтовой ошибки, функция-член должна вернуть строку байтовой ошибки. В противном случае функция-член должна генерировать объект класса range_error.
using wide_string = basic_string<Elem, char_traits<Elem>, Wide_alloc>;
explicit wstring_convert(Codecvt* pcvt = new Codecvt);
wstring_convert(Codecvt* pcvt, state_type state);
explicit wstring_convert(const byte_string& byte_err,
const wide_string& wide_err = wide_string());
Effects: Первый конструктор должен хранить pcvt в cvtptr и значения по умолчанию в cvtstate, byte_err_stringи wide_err_string. Второй конструктор должен сохранять pcvt в cvtptr, state в cvtstateи значения по умолчанию в byte_err_string и wide_err_string; кроме того, сохраненное состояние должно сохраняться между вызовами from_bytes и to_bytes. Третий конструктор должен сохранять new Codecvt in cvtptr, state_type() in cvtstate, byte_err in byte_err_stringи wide_err in wide_err_string.
~wstring_convert();
Шаблон класса wbuffer_convert выглядит как широкий буфер потока, но все операции ввода-вывода выполняются через нижележащий буфер потока байтов, который вы указываете при его создании. Как и шаблон класса wstring_convert, он позволяет указать фасет преобразования кода для выполнения преобразований, не затрагивая никакие потоки или языковые стандарты.
namespace std { template <class Codecvt, class Elem = wchar_t, class Tr = char_traits<Elem>> class wbuffer_convert : public basic_streambuf<Elem, Tr> { public: using state_type = typename Codecvt::state_type; explicit wbuffer_convert(streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt, state_type state = state_type()); ~wbuffer_convert(); wbuffer_convert(const wbuffer_convert&) = delete; wbuffer_convert& operator=(const wbuffer_convert&) = delete; streambuf* rdbuf() const; streambuf* rdbuf(streambuf* bytebuf); state_type state() const; private: streambuf* bufptr; // exposition only Codecvt* cvtptr; // exposition only state_type cvtstate; // exposition only }; }
Шаблон класса описывает буфер потока, который управляет передачей элементов типа Elem, характеристики символов которых описываются классом Tr, в буфер потока байтов типа и из него streambuf. Преобразование между последовательностью Elem значений и многобайтовыми последовательностями выполняется объектом класса Codecvt, который должен удовлетворять требованиям стандартного аспекта преобразования кода codecvt<Elem, char, mbstate_t>.
В объекте этого шаблона класса хранятся:
bufptr - указатель на его нижележащий буфер потока байтов
cvtptr - указатель на выделенный объект преобразования (который освобождается при wbuffer_convert уничтожении объекта)
cvtstate - объект состояния преобразования
state_type state() const;
streambuf* rdbuf() const;
streambuf* rdbuf(streambuf* bytebuf);
using state_type = typename Codecvt::state_type;
explicit wbuffer_convert(
streambuf* bytebuf = 0,
Codecvt* pcvt = new Codecvt,
state_type state = state_type());
Effects: Конструктор строит объект буфера потока, инициализирует bufptr к bytebuf, инициализирует cvtptr к pcvtи инициализирует cvtstate к state.
~wbuffer_convert();