Annex D (normative) Compatibility features [depr]

В этом разделе описаны функции стандарта C ++, которые указаны для совместимости с существующими реализациями.

Это устаревшие функции, которые deprecated определены как: Нормативные для текущей редакции этого международного стандарта, но были определены как кандидаты на удаление из будущих редакций. Реализация может объявлять имена библиотек и сущности, описанные в этом разделе, с расширением deprecated attribute.

D.1 Redeclaration of static constexpr data members [depr.static_constexpr]

Для совместимости с предыдущими международными стандартами 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]

D.2 Implicit declaration of copy functions [depr.impldec]

Неявное определение конструктора копирования по умолчанию считается устаревшим, если в классе есть объявленный пользователем оператор присваивания копии или объявленный пользователем деструктор. Неявное определение оператора присваивания копии по умолчанию считается устаревшим, если в классе есть объявленный пользователем конструктор копирования или объявленный пользователем деструктор ([class.dtor], [class.copy]). В будущей редакции этого международного стандарта эти неявные определения могут быть удалены ([dcl.fct.def]).

D.3 Deprecated exception specifications [depr.except.spec]

Не noexcept-specifier throw() рекомендуется.

D.4 C++standard library headers [depr.cpp.headers]

Для совместимости с предыдущими международными стандартами C ++ стандартная библиотека C ++ предоставляет заголовки <ccomplex> ([depr.ccomplex.syn]), <cstdalign> ([depr.cstdalign.syn]), <cstdbool> ([depr.cstdbool.syn]) и <ctgmath> ([depr.ctgmath.syn]). Использование этих заголовков не рекомендуется.

D.4.1 Header <ccomplex> synopsis [depr.ccomplex.syn]

#include <complex>

Заголовок <ccomplex> ведет себя так, как будто он просто включает заголовок <complex> ([complex.syn]).

D.4.2 Header <cstdalign> synopsis [depr.cstdalign.syn]

#define __alignas_­is_­defined 1

Содержимое заголовка <cstdalign> такое же, как заголовок стандартной библиотеки C <stdalign.h>, со следующими изменениями: Заголовок <cstdalign> и заголовок <stdalign.h> не должны определять названный макрос alignas.

См. Также: ISO C 7.15.

D.4.3 Header <cstdbool> synopsis [depr.cstdbool.syn]

#define __bool_­true_­false_­are_­defined 1

Содержимое заголовка <cstdbool> такие же , как заголовок стандартной библиотеки C <stdbool.h>, со следующими изменениями: заголовок <cstdbool> и заголовок <stdbool.h> не должен определять макросы с именем bool, trueили false.

См. Также: ISO C 7.18.

D.4.4 Header <ctgmath> synopsis [depr.ctgmath.syn]

#include <complex>
#include <cmath>

Заголовок <ctgmath> просто включает заголовки <complex> ([complex.syn]) и <cmath> ([cmath.syn]).

[ Note: Перегрузка , предусмотренная в С помощью макросов типа унифицированного уже предусмотрены в <complex> и с <cmath> помощью «достаточных» дополнительных перегрузок. ]end note

D.5 C standard library headers [depr.c.headers]

Для совместимости со стандартной библиотекой C стандартная библиотека C ++ предоставляет, как C headers показано в таблице 141.

Таблица 141 - Заголовки C
<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> stdend example

D.6 char* streams [depr.str.strstreams]

Заголовок определяет три типа, которые связывают буферы потока с объектами символьного массива и помогают читать и записывать такие объекты.<strstream>

D.6.1 Class strstreambuf [depr.strstreambuf]

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.

D.6.1.1 strstreambuf constructors [depr.strstreambuf.cons]

explicit strstreambuf(streamsize alsize_arg = 0);

Effects: Создает объект класса strstreambuf, инициализируя базовый класс с помощью streambuf(). Постусловия этой функции указаны в таблице 142.

Таблица 142 - strstreambuf(streamsize) эффекты
ЭлементЦенить
strmode dynamic
alsize alsize_­arg
palloc нулевой указатель
pfree нулевой указатель

strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*));

Effects: Создает объект класса strstreambuf, инициализируя базовый класс с помощью streambuf(). Постусловия этой функции указаны в таблице 143.

Таблица 143 - strstreambuf(void* (*)(size_­t), void (*)(void*)) эффекты
ЭлементЦенить
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.

Таблица 144 - strstreambuf(charT*, streamsize, charT*) эффекты
ЭлементЦенить
strmode 0
alsize неуказанное значение
palloc нулевой указатель
pfree нулевой указатель

gnext_­arg должен указывать на первый элемент объекта массива, количество элементов N которого определяется следующим образом:

  • Если n > 0, то N есть n.

  • Если n == 0, то N есть std​::​strlen(gnext_­arg).

  • Если n < 0, то N есть INT_­MAX.331

Если pbeg_­arg это нулевой указатель, функция выполняет:

setg(gnext_arg, gnext_arg, gnext_arg + N);

В противном случае функция выполняет:

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] описывает, как освобождается динамически выделенный объект массива.)

Сигнатура функции strlen(const char*) объявлена ​​в . Макрос определен в . <cstring>INT_­MAX<climits>

D.6.1.2 Member functions [depr.strstreambuf.members]

void freeze(bool freezefl = true);

Effects: Если не strmode & dynamic равно нулю, изменяет статус фиксации объекта динамического массива следующим образом:

  • Если freezefl IS true, функция устанавливает frozen в strmode.

  • В противном случае, она очищает frozen в strmode.

char* str();

Effects: Вызывает freeze(), а затем возвращает начальный указатель для входной последовательности gbeg.

Remarks: Возвращаемое значение может быть нулевым указателем.

int pcount() const;

Effects: Если следующий указатель для выходной последовательности pnext, является нулевым указателем, возвращает ноль. В противном случае возвращает текущую эффективную длину объекта массива как следующий указатель минус начальный указатель для выходной последовательности pnext - pbeg.

D.6.1.3 strstreambuf overridden virtual functions [depr.strstreambuf.virtuals]

int_type overflow(int_type c = EOF) override;

Effects: Добавляет символ, обозначенный значком, c к выходной последовательности, если возможно, одним из двух способов:

  • Если c != EOF и если либо выходная последовательность имеет позицию записи доступны или функция делает позицию записи доступную (как описано ниже), назначает c для *pnext++.

    Возврат (unsigned char)c.

  • Если c == EOFнет символа для добавления.

    Возвращает значение, отличное от EOF.

Возвращает, EOF чтобы указать на сбой.

Remarks: Функция может изменить количество позиций записи, доступных в результате любого вызова.

Чтобы сделать позицию записи доступной, функция перераспределяет (или первоначально выделяет) объект массива с достаточным количеством элементов, 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.

Возвращает, EOF чтобы указать на сбой.

Remarks: Если функция может быть успешной более чем одним из этих способов, не указано, какой путь будет выбран. Функция может изменить количество позиций возврата, доступных в результате любого вызова.

int_type underflow() override;

Effects: Считывает символ из input sequence, если это возможно, не перемещая позицию потока мимо него, как показано ниже:

  • Если входная последовательность имеет доступную позицию чтения, функция сигнализирует об успехе, возвращаясь (unsigned char)​*gnext.

  • В противном случае, если текущий указатель на следующую запись pnext не является нулевым указателем и больше, чем текущий указатель конца чтения gend, делает read position доступным, присваивая gend значение больше gnext и не больше pnext.

    Возврат (unsigned char)*gnext.

Возвращает, EOF чтобы указать на сбой.

Remarks: Функция может изменить количество позиций чтения, доступных в результате любого вызова.

pos_type seekoff(off_type off, seekdir way, openmode which = in | out) override;

Effects: Если возможно, изменяет положение потока в одной из управляемых последовательностей, как указано в Табл 145.

Стол 145 - seekoff позиционирование
УсловияРезультат
(which & ios​::​in) != 0 позиционирует входную последовательность
(which & ios​::​out) != 0 позиционирует выходную последовательность
(which & (ios​::​in |
ios​::​out)) == (ios​::​in |
ios​::​out)) и
way == либо,
ios​::​beg либо
ios​::​end
позиционирует как входную, так и выходную последовательности
Иначе операция позиционирования не выполняется.

Для позиционирования последовательности, если ее следующий указатель является нулевым указателем, операция позиционирования завершается ошибкой. В противном случае функция определяет, newoff как указано в таблице 146.

Таблица 146 - newoff значения
Состояние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;

Effects: Реализация определена, но setbuf(0, 0) не имеет никакого эффекта.

При alsize принятии этого решения следует учитывать реализацию .

D.6.2 Class istrstream [depr.istrstream]

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 объект.

D.6.2.1 istrstream constructors [depr.istrstream.cons]

explicit istrstream(const char* s); explicit istrstream(char* s);

Effects: Создает объект класса istrstream, инициализируя базовый класс istream(&sb) и инициализируя sb с помощью strstreambuf(s,0). s обозначает первый элемент ntbs .

istrstream(const char* s, streamsize n); istrstream(char* s, streamsize n);

Effects: Создает объект класса istrstream, инициализируя базовый класс istream(&sb) и инициализируя sb с помощью strstreambuf(s,n). s должен обозначать первый элемент массива, длина которого равна n elements, и n должна быть больше нуля.

D.6.2.2 Member functions [depr.istrstream.members]

strstreambuf* rdbuf() const;

Returns: const_­cast<strstreambuf*>(&sb).

char* str();

Returns: rdbuf()->str().

D.6.3 Class ostrstream [depr.ostrstream]

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 объект.

D.6.3.1 ostrstream constructors [depr.ostrstream.cons]

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

Сигнатура функции strlen(const char*) объявлена ​​в .<cstring>

D.6.3.2 Member functions [depr.ostrstream.members]

strstreambuf* rdbuf() const;

Returns: (strstreambuf*)&sb.

void freeze(bool freezefl = true);

Effects: Звонки rdbuf()->freeze(freezefl).

char* str();

Returns: rdbuf()->str().

int pcount() const;

Returns: rdbuf()->pcount().

D.6.4 Class strstream [depr.strstream]

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 объект.

D.6.4.1 strstream constructors [depr.strstream.cons]

strstream();

Effects: Создает объект класса strstream, инициализируя базовый класс с помощью iostream(&sb).

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)).

D.6.4.2 strstream destructor [depr.strstream.dest]

virtual ~strstream();

Effects: Уничтожает объект класса strstream.

D.6.4.3 strstream operations [depr.strstream.oper]

strstreambuf* rdbuf() const;

Returns: &sb.

void freeze(bool freezefl = true);

Effects: Звонки rdbuf()->freeze(freezefl).

char* str();

Returns: rdbuf()->str().

int pcount() const;

Returns: rdbuf()->pcount().

D.7 uncaught_­exception [depr.uncaught]

В шапке есть следующее дополнение:<exception>

namespace std {
  bool uncaught_exception() noexcept;
}

bool uncaught_exception() noexcept;

Returns: uncaught_­exceptions() > 0.

D.8 Old adaptable function bindings [depr.func.adaptor.binding]

D.8.1 Weak result types [depr.weak.result_type]

А 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 не определяется.

D.8.2 Typedefs to support function binders [depr.func.adaptor.typedefs]

Чтобы включить старые функции адаптеров для управления объектами функции , которые принимают один или два аргумент, многие из функциональных объектов в настоящем стандарте , соответственно , обеспечивают 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;
  };
}

D.8.3 Negators [depr.negators]

В шапку внесены следующие дополнения:<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;

Returns: !pred(x).

template <class Predicate> constexpr unary_negate<Predicate> not1(const Predicate& pred);

Returns: unary_­negate<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;

Returns: !pred(x,y).

template <class Predicate> constexpr binary_negate<Predicate> not2(const Predicate& pred);

Returns: binary_­negate<Predicate>(pred).

D.9 The default allocator [depr.default.allocator]

Следующие члены и явная специализация шаблона класса определены в дополнение к тем, которые указаны в [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;

Returns: addressof(x).

T* allocate(size_t n, const void* hint);

Returns: Указатель на начальный элемент массива хранения размера n * sizeof(T), выровненный соответствующим образом для объектов типа T. Поддерживаются ли избыточно выровненные типы, зависит от реализации ([basic.align]).

Remarks: Хранилище получается с помощью вызова ​::​operator new(std​::​size_­t) ([new.delete]), но не указано, когда и как часто вызывается эта функция.

Throws: bad_­alloc если невозможно получить хранилище.

template <class U, class... Args> void construct(U* p, Args&&... args);

Effects: Как будто по: ​::​new((void *)p) U(std​::​forward<Args>(args)...);

template <class U> void destroy(U* p);

Effects: Как будто мимо p->~U().

size_t max_size() const noexcept;

Returns: Наибольшее значение, N при котором вызов allocate(N, 0) может быть успешным.

D.10 Raw storage iterator [depr.storage.iterator]

В шапке есть следующее дополнение:<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*();

Returns: *this

raw_storage_iterator& operator=(const T& element);

Requires: T будет CopyConstructible.

Effects: Создает значение из element того места, на которое указывает итератор.

Returns: Ссылка на итератор.

raw_storage_iterator& operator=(T&& element);

Requires: T будет MoveConstructible.

Effects: Создает значение из std​::​move(element) того места, на которое указывает итератор.

Returns: Ссылка на итератор.

raw_storage_iterator& operator++();

Effects: Предварительное приращение: продвигает итератор вперед и возвращает ссылку на обновленный итератор.

raw_storage_iterator operator++(int);

Effects: Постинкремент: продвигает итератор вперед и возвращает старое значение итератора.

OutputIterator base() const;

Returns: Итератор типа, OutputIterator который указывает на то же значение, что и *this указывает на.

D.11 Temporary buffers [depr.temporary.buffer]

В шапку внесены следующие дополнения:<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);

Effects: Освобождает хранилище, на которое ссылается p.

Requires: p должен быть значением указателя, возвращенным более ранним вызовом get_­temporary_­buffer , который не был признан недействительным в результате промежуточного вызова return_­temporary_­buffer(T*).

Throws: Ничего такого.

D.12 Deprecated type traits [depr.meta.types]

В шапке есть следующее дополнение:<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...>.

Поведение программы, которая добавляет специализации is_­literal_­type или is_­literal_­type_­v не определено.

D.13 Deprecated iterator primitives [depr.iterator.primitives]

D.13.1 Basic iterator [depr.iterator.basic]

В шапке есть следующее дополнение:<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]

D.14 Deprecated shared_­ptr observers [depr.util.smartptr.shared.obs]

Следующий член определен в дополнение к тем членам, которые указаны в [util.smartptr.shared]:

namespace std {
  template<class T> class shared_ptr {
  public:
    bool unique() const noexcept;
  };
}

bool unique() const noexcept;

Returns: use_­count() == 1.

D.15 Deprecated standard code conversion facets [depr.locale.stdcvt]

Заголовок <codecvt> содержит аспекты преобразования кода для различных кодировок символов.

D.15.1 Header <codecvt> synopsis [depr.codecvt.syn]

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();
    };
}

D.15.2 Requirements [depr.locale.stdcvt.req]

Для каждого из трех аспектов преобразования кода codecvt_­utf8, codecvt_­utf16и codecvt_­utf8_­utf16:

  • Elem тип широких символов, например wchar_­t, char16_­tили char32_­t.

  • Maxcode - это самый большой код с широкими символами, который фасет будет читать или писать без сообщения об ошибке преобразования.

  • Если (Mode & consume_­header), то при чтении многобайтовой последовательности фасет должен использовать начальную последовательность заголовка, если она присутствует, для определения порядка следования байтов последующей многобайтовой последовательности, которая должна быть прочитана.

  • Если (Mode & generate_­header), фасет должен генерировать начальную последовательность заголовка при записи многобайтовой последовательности, чтобы объявить о порядке следования записываемой последующей многобайтовой последовательности.

  • Если (Mode & little_­endian), фасет должен генерировать многобайтовую последовательность в обратном порядке, в отличие от стандартного обратного порядка байтов.

Для грани : codecvt_­utf8

  • Фасет должен преобразовывать многобайтовые последовательности UTF-8 в UCS2 или UCS4 (в зависимости от размера Elem) в программе.

  • Порядок байтов не влияет на то, как читаются или записываются многобайтовые последовательности.

  • Многобайтовые последовательности могут быть записаны в виде текстового или двоичного файла.

Для грани : codecvt_­utf16

  • Фасет должен преобразовывать многобайтовые последовательности UTF-16 в UCS2 или UCS4 (в зависимости от размера Elem) в программе.

  • Многобайтовые последовательности должны читаться или записываться в соответствии с указанным выше Mode флагом.

  • Многобайтовые последовательности могут быть записаны только как двоичный файл. Попытка записи в текстовый файл приводит к неопределенному поведению.

Для грани : codecvt_­utf8_­utf16

  • Фасет должен преобразовывать многобайтовые последовательности UTF-8 в UTF-16 (один или два 16-битных кода) в программе.

  • Порядок байтов не влияет на то, как читаются или записываются многобайтовые последовательности.

  • Многобайтовые последовательности могут быть записаны в виде текстового или двоичного файла.

См. Также: ISO / IEC 10646-1: 1993.

D.16 Deprecated convenience conversion interfaces [depr.conversions]

В шапку <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;
}

D.16.1 Class template wstring_­convert [depr.conversions.string]

Шаблон класса 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>;

Тип должен быть синонимом для basic_­string<char, char_­traits<char>, Byte_­alloc>.

size_t converted() const noexcept;

Returns: cvtcount.

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;

Тип должен быть синонимом для wide_­string​::​traits_­type​::​int_­type.

state_type state() const;

возвращается cvtstate.

using state_type = typename Codecvt::state_type;

Тип должен быть синонимом для 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>;

Тип должен быть синонимом для 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());

Requires: Для первого и второго конструкторов pcvt != nullptr.

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();

Effects: Деструктор должен удалить cvtptr.

D.16.2 Class template wbuffer_­convert [depr.conversions.buffer]

Шаблон класса 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;

Returns: cvtstate.

streambuf* rdbuf() const;

Returns: bufptr.

streambuf* rdbuf(streambuf* bytebuf);

Effects: Магазины bytebuf в bufptr.

Returns: Предыдущее значение bufptr.

using state_type = typename Codecvt::state_type;

Тип должен быть синонимом для Codecvt​::​state_­type.

explicit wbuffer_convert( streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt, state_type state = state_type());

Requires: pcvt != nullptr.

Effects: Конструктор строит объект буфера потока, инициализирует bufptr к bytebuf, инициализирует cvtptr к pcvtи инициализирует cvtstate к state.

~wbuffer_convert();

Effects: Деструктор должен удалить cvtptr.