Annex C (informative) Compatibility [diff]

C.2 C++ and ISO C++ 2003 [diff.cpp03]

В этом подпункте перечислены различия между C ++ и ISO C ++ 2003 (ISO / IEC 14882: 2003,Programming Languages — C++) по главам этого документа.

C.2.1 Clause [lex]: lexical conventions [diff.cpp03.lex]

[lex.pptoken]
Изменение: новые виды строковых литералов.
Обоснование: требуется для новых функций.
Влияние на исходную функцию: действительный код C ++ 2003 может не компилироваться или давать другие результаты в соответствии с этим международным стандартом. В частности, макросы по имениR,u8, u8R,u,uR,U,UR, илиLR не будут расширены , когда рядом с строковым литералом , но будет интерпретироваться как часть строки литерала. Например,

#define u8 "abc"
const char* s = u8"def";        // Previously "abcdef", now "def"

[lex.pptoken]
Изменение: поддержка определяемых пользователем буквальных строк.
Обоснование: требуется для новых функций.
Влияние на исходную функцию: действительный код C ++ 2003 может не скомпилировать или привести к другим результатам в соответствии с этим международным стандартом, как показано в следующем примере.

#define _x "there"
"hello"_x         // #1

Раньше # 1 состоял бы из двух отдельных токенов предварительной обработки, и макрос_­x был бы расширен. В этом международном стандарте № 1 состоит из одного токена предварительной обработки, поэтому макрос не раскрывается.

[lex.key]
Изменение: новые ключевые слова.
Обоснование: требуется для новых функций.
Влияние на оригинальной функции: Добавлена в таблице5, следующие идентификаторы новых ключевых слов: alignas, alignof, char16_­t, char32_­t, constexpr, decltype, noexcept, nullptr, static_­assert, и thread_­local. Допустимый код C ++ 2003, использующий эти идентификаторы, недопустим в этом международном стандарте.

[lex.icon]
Изменение: Тип целочисленных литералов.
Обоснование: совместимость с C99.
Влияние на исходную функцию: некоторые целочисленные литералы, размер которых больше, чем может быть представлен,long могут измениться с целочисленного типа без знака наsigned long long.

C.2.2 Clause [conv]: standard conversions [diff.cpp03.conv]

[conv.ptr]
Изменение: целочисленными константами нулевого указателя являются только литералы.
Обоснование: устранение неожиданных взаимодействий с шаблонами и постоянными выражениями.
Влияние на исходную функцию: действительный код C ++ 2003 может не скомпилировать или дать другие результаты в соответствии с этим международным стандартом, как показано в следующем примере:

void f(void *);  // #1
void f(...);     // #2
template<int N> void g() {
  f(0*N);        // calls #2; used to call #1
}

C.2.3 Clause [expr]: expressions [diff.cpp03.expr]

[expr.mul]
Изменение: укажите округление для результатов целых чисел/ и%.
Обоснование: Повышение переносимости, совместимость с C99.
Влияние на исходную функцию: действительный код C ++ 2003, в котором используется целочисленное деление, округляет результат до 0 или до отрицательной бесконечности, тогда как этот международный стандарт всегда округляет результат до 0.

[expr.log.and]
Изменение:&& действительно в type-name.
Обоснование: требуется для новых функций.
Влияние на исходную функцию: действительный код C ++ 2003 может не скомпилировать или дать другие результаты в соответствии с этим международным стандартом, как показано в следующем примере:

bool b1 = new int && false;           // previously false, now ill-formed
struct S { operator int(); };
bool b2 = &S::operator int && false;  // previously false, now ill-formed

C.2.4 Clause [dcl.dcl]: declarations [diff.cpp03.dcl.dcl]

[dcl.spec]
Изменение: удалитьauto как спецификатор класса хранения.
Обоснование: Новая функция.
Влияние на исходную функцию: действительный код C ++ 2003, в котором ключевое слово используется вauto качестве спецификатора класса хранения, может быть недопустимым в этом международном стандарте. В этом международном стандартеauto указывает, что тип переменной должен быть выведен из выражения ее инициализатора.

C.2.5 Clause [dcl.decl]: declarators [diff.cpp03.dcl.decl]

[dcl.init.list]
Изменение: сужение ограничений в агрегатных инициализаторах.
Обоснование: ловит ошибки.
Влияние на исходную функцию: действительный код C ++ 2003 может не соответствовать этому международному стандарту. Например, следующий код действителен в C ++ 2003 , но недействителен в настоящем стандарте , потому чтоdouble вint этот сужающее преобразование:

int x[] = { 2.0 };

C.2.6 Clause [special]: special member functions [diff.cpp03.special]

[class.ctor],[class.dtor], Изменить: Косвенно-объявленные специальные функции - члены определяются как удаленные , когда неявное определение было бы плохо сформированным. Обоснование: Улучшает ошибку вывода аргументов шаблона. Влияние на исходную функцию: допустимая программа C ++ 2003, использующая одну из этих специальных функций-членов в контексте, где определение не требуется (например, в выражении, которое потенциально не оценивается), становится некорректной.[class.copy]


[class.dtor] (деструкторы)
Изменение: объявленные пользователем деструкторы имеют неявную спецификацию исключения.
Обоснование: Уточнение требований к деструктору.
Влияние на исходную функцию: действующий код C ++ 2003 в этом международном стандарте может выполняться иначе. В частности, деструкторы, которые генерируют исключения, будут вызыватьstd​::​terminate (без вызоваstd​::​unexpected), если их спецификация исключения не выбрасывает.

C.2.7 Clause [temp]: templates [diff.cpp03.temp]

[temp.param]
Изменить: Удалитьexport.
Обоснование: Нет консенсуса по реализации.
Влияние на исходную функцию: действительное объявление C ++ 2003, содержащеесяexport в этом международном стандарте, неправильно сформировано.

[temp.arg]
Изменение: убраны требования к пробелам для прямоугольных скобок вложенного закрывающего шаблона.
Обоснование: считается постоянным, но незначительным раздражением. Псевдонимы шаблонов, представляющие типы, не относящиеся к классам, усугубят проблемы с пробелами.
Влияние на исходную функцию: изменение семантики четко определенного выражения. Допустимое выражение C ++ 2003, содержащее правую угловую скобку («>»), за которой сразу следует другая правая угловая скобка, теперь можно рассматривать как закрывающие два шаблона. Например, следующий код действителен в C ++ 2003, потому что «>>» является оператором сдвига вправо, но недопустим в этом международном стандарте, поскольку «>>» закрывает два шаблона.

template <class T> struct X { };
template <int N> struct Y { };
X< Y< 1 >> 2 > > x;

[temp.dep.candidate]
Изменение: разрешить зависимые вызовы функций с внутренней связью.
Обоснование: чрезмерно ограничены, упрощают правила разрешения перегрузки.
Влияние на исходную функцию: действующая программа на C ++ 2003 может получить результат, отличный от этого международного стандарта.

C.2.8 Clause [library]: library introduction [diff.cpp03.library]

[library] - Изменение: новые зарезервированные идентификаторы. Обоснование: требуется новыми функциями. Влияние на исходную функцию: действительный код C ++ 2003, который использует любые идентификаторы, добавленные в стандартную библиотеку C ++ этим международным стандартом, может не скомпилировать или дать другие результаты в этом международном стандарте. Полный список идентификаторов, используемых стандартной библиотекой C ++, можно найти в Указателе имен библиотек в этом международном стандарте.[thread]


[headers]
Изменение: новые заголовки.
Обоснование: новая функциональность.
Влияние на исходной функции: Следующие C ++ заголовки являются новыми: <array>, <atomic>, <chrono>, <codecvt>, <condition_­variable>, <forward_­list>, <future>, <initializer_­list>, <mutex>, <random>, <ratio>, <regex>, <scoped_­allocator>, <system_­error>, <thread>, <tuple>, <typeindex>, <type_­traits>,
<unordered_­map>, и <unordered_­set>. Кроме того, следующие заголовки совместимости С являются новыми: <ccomplex>, <cfenv>, <cinttypes>, <cstdalign>, <cstdbool>, <cstdint>, <ctgmath>, и <cuchar>. Допустимый код C ++ 2003, в котором#includeзаголовки с такими именами могут быть недопустимыми в этом международном стандарте.

[swappable.requirements]
Влияние на исходную функцию: функцияswap перемещена в другой заголовок.
Обоснование: удалить зависимость от<algorithm> forswap.
Влияние на исходную функцию: действительный код C ++ 2003, который был скомпилирован с ожиданием<algorithm> наличия подкачки, возможно, придется вместо этого включить<utility>.

[namespace.posix]
Изменение: Новое зарезервированное пространство имен.
Обоснование: новая функциональность.
Влияние на исходную функцию: глобальное пространство именposix теперь зарезервировано для стандартизации. Допустимый код C ++ 2003, использующий пространство имен верхнего уровня,posix может быть недопустимым в этом международном стандарте.

[res.on.macro.definitions]
Изменение: Дополнительные ограничения на имена макросов.
Обоснование: Избегайте сложных для диагностики или непереносимых конструкций.
Влияние на исходную функцию: Имена идентификаторов атрибутов не могут использоваться в качестве имен макросов. Действительный C ++ 2003 код , который определяетoverride,final, carries_­dependencyили вnoreturn виде макросов является недействительным в настоящем стандарте.

C.2.9 Clause [language.support]: language support library [diff.cpp03.language.support]

[new.delete.single]
Изменение: Связываниеnew иdelete операторы.
Обоснование: две метательные сигнатуры одного объектаoperator new и operator delete теперь определены для формирования базовой функциональности для других операторов. Это поясняет, что замена только этих двух подписей изменяет другие, даже если они не были изменены явно.
Влияние на исходную функцию: действительный код C ++ 2003, заменяющий глобальные операторыnew или,deleteможет выполняться иначе в этом международном стандарте. Например, следующая программа должна писать"custom deallocation" дважды: один раз для удаления одного объекта и один раз для удаления массива.

#include <cstdio>
#include <cstdlib>
#include <new>

void* operator new(std::size_t size) throw(std::bad_alloc) {
  return std::malloc(size);
}

void operator delete(void* ptr) throw() {
  std::puts("custom deallocation");
  std::free(ptr);
}

int main() {
  int* i = new int;
  delete i;                     // single-object delete
  int* a = new int[3];
  delete [] a;                  // array delete
}

[new.delete.single]
Изменение:operator new может вызывать исключения, отличные от std​::​bad_­alloc.
Обоснование: последовательное применениеnoexcept.
Влияние на исходную функцию: действительный код C ++ 2003, который предполагает, чтоoperator new только глобальные выбросыstd​::​bad_­alloc могут выполняться иначе в этом международном стандарте.

C.2.10 Clause [diagnostics]: diagnostics library [diff.cpp03.diagnostics]

[errno]
Изменение: номера локальных ошибок потока.
Обоснование: Поддержка новых возможностей потоков.
Влияние на исходную функцию: действительный, но зависящий от реализации код C ++ 2003, который полагается на errno то, что он одинаков во всех потоках, может изменить поведение в этом международном стандарте.

C.2.11 Clause [utilities]: general utilities library [diff.cpp03.utilities]

[util.dynamic.safety]
Изменение: минимальная поддержка регионов со сборкой мусора.
Обоснование: требуется новой функцией.
Влияние на исходную функцию: действительный код C ++ 2003, скомпилированный без поддержки отслеживаемых указателей, который взаимодействует с новым кодом C ++ с использованием областей, объявленных достижимыми, может иметь другое поведение во время выполнения.

[refwrap],[arithmetic.operations],[comparisons], [logical.operations],[bitwise.operations], Изменение: Стандартные типы объектов функции больше не происходят от или . Обоснование: заменено новой функцией; и больше не определены. Влияние на исходную функцию: действительный код C ++ 2003, который зависит от типов функциональных объектов, производных от этого международного стандарта, или может не компилироваться в соответствии с ним.[depr.negators]
std​::​unary_­function std​::​binary_­function
unary_­function binary_­function
unary_­function binary_­function

C.2.12 Clause [strings]: strings library [diff.cpp03.strings]

[string.classes]
Изменение:basic_­string требования больше не допускают использование строк с подсчетом ссылок.
Обоснование: недействительность немного отличается от строк со счетчиком ссылок. Это изменение упорядочивает поведение данного международного стандарта.
Влияние на исходную функцию: действующий код C ++ 2003 в этом международном стандарте может выполняться иначе.

[string.require]
Изменение: ослабитьbasic_­string правила признания недействительными.
Обоснование: разрешить оптимизацию с использованием небольших строк.
Влияние на исходную функцию: действующий код C ++ 2003 в этом международном стандарте может выполняться иначе. Некоторыеconst функции-члены, такие какdata иc_­str, больше не делают итераторы недействительными.

C.2.13 Clause [containers]: containers library [diff.cpp03.containers]

[container.requirements]
Изменение: сложностьsize() функций-членов теперь постоянна.
Обоснование: Отсутствие спецификации сложностиsize() привело к различным реализациям с несовместимыми характеристиками производительности.
Влияние на исходную функцию: некоторые реализации контейнеров, соответствующие C ++ 2003, могут не соответствовать указаннымsize() требованиям в этом международном стандарте. Регулировка контейнеров, например, вstd​::​list соответствии с более строгими требованиями, может потребовать несовместимых изменений.

[container.requirements]
Изменение: Изменение требований: расслабление.
Обоснование: Разъяснение.
Влияние на исходную функцию: допустимый код C ++ 2003, который пытается удовлетворить указанные требования к контейнеру, теперь может быть переопределен. Код, который пытался переносить между контейнерами, возможно, потребуется изменить следующим образом:

  • не все контейнеры предоставляютsize(); использоватьempty() вместоsize() == 0;

  • не все контейнеры пусты после конструкции (array);

  • не все контейнеры имеют постоянную сложность дляswap() (array).

[container.requirements]
Изменение: Изменение требований: конструктивно по умолчанию.
Обоснование: Уточнение требований к контейнерам.
Влияние на исходную функцию: действительный код C ++ 2003, который пытается явно создать экземпляр контейнера с использованием определяемого пользователем типа без конструктора по умолчанию, может не компилироваться.

[sequence.reqmts], Изменение: Изменения подписи: из возвращаемых типов. Обоснование: старая подпись отбрасывала полезную информацию, пересчет которой может быть дорогостоящим. Влияние на исходную функцию: были изменены следующие функции-члены: [associative.reqmts]
void

  • erase(iter) дляset,multiset,map,multimap

  • erase(begin, end) дляset,multiset,map,multimap

  • insert(pos, num, val) дляvector,deque,list,forward_­list

  • insert(pos, beg, end) дляvector,deque,list,forward_­list

Допустимый код C ++ 2003, который полагается на возвращение этих функцийvoid (например, код, который создает указатель на функцию-член, указывающую на одну из этих функций), не сможет скомпилировать с этим международным стандартом.

[sequence.reqmts], Изменение: подпись меняется: с на параметры. Обоснование: превышение спецификации. Влияние на исходную функцию: подписи следующих функций-членов изменились с принятия на принятие :[associative.reqmts]
iterator const_­iterator

iterator const_­iterator

  • insert(iter, val) дляvector,deque,list, set,multiset,map,multimap

  • insert(pos, beg, end) дляvector,deque,list, forward_­list

  • erase(begin, end) дляset,multiset,map,multimap

  • все формыlist​::​splice

  • все формыlist​::​merge

Допустимый код C ++ 2003, использующий эти функции, может не соответствовать этому международному стандарту.

[sequence.reqmts], Изменение: Подпись изменения: . Обоснование: производительность, совместимость с семантикой перемещения. Влияние на исходный объект: для , и переданное значение заливки теперь передается по ссылке, а не по значению, и была добавлена ​​дополнительная перегрузка . Допустимый код C ++ 2003, использующий эту функцию, может не соответствовать этому международному стандарту.[associative.reqmts]
resize

vectordequelistresize resize

C.2.14 Clause [algorithms]: algorithms library [diff.cpp03.algorithms]

[algorithms.general]
Изменение: состояние результата входов после применения некоторых алгоритмов.
Обоснование: требуется новой функцией.
Влияние на исходную функцию: действующая программа C ++ 2003 может обнаружить, что объект с допустимым, но неуказанным состоянием имеет другое действительное, но неуказанное состояние в соответствии с настоящим международным стандартом. Например,std​::​remove и std​::​remove_­if может оставить хвост входной последовательности с другим набором значений, чем раньше.

C.2.15 Clause [numerics]: numerics library [diff.cpp03.numerics]

[complex.numbers]
Изменение: указанное представление комплексных чисел.
Обоснование: совместимость с C99.
Влияние на исходную функцию: действительный код C ++ 2003, в котором используются зависящие от реализации знания о двоичном представлении требуемых специализаций шаблонов, std​::​complex может быть несовместим с этим международным стандартом.

C.2.16 Clause [input.output]: input/output library [diff.cpp03.input.output]

[istream::sentry], [ostream::sentry], Изменение: Укажите использование в существующем логические функции преобразования. Обоснование: прояснить намерения, избегать обходных путей. Влияние на исходную функцию: действительный код C ++ 2003, основанный на неявных логических преобразованиях, не будет компилироваться с этим международным стандартом. Такие преобразования происходят в следующих условиях:[iostate.flags]
explicit

  • передача значения функции, которая принимает аргумент типаbool;

  • использованиеoperator== для сравнения сfalse илиtrue;

  • возврат значения из функции с типом возвратаbool;

  • инициализация членов типаbool через агрегатную инициализацию;

  • инициализация,const bool& которая привязывается к временному.

[ios::failure]
Изменение: изменить базовый классstd​::​ios_­base​::​failure.
Обоснование: более подробные сообщения об ошибках.
Влияние на исходный элемент: std​::​ios_­base​::​failure больше не является производным от std​::​exception, а является производным отstd​::​system_­error, который, в свою очередь, является производным отstd​::​runtime_­error. Допустимый код C ++ 2003, предполагающий, что онstd​::​ios_­base​::​failure является производным напрямую, std​::​exception в этом международном стандарте может выполняться иначе.

[ios.base]
Изменение: типы флагов вstd​::​ios_­base теперь являются битовыми масками со значениями, определенными как статические члены constexpr.
Обоснование: требуется для новых функций.
Влияние на исходную функцию: действительный код C ++ 2003, который полагается наstd​::​ios_­base типы флагов, представленныеstd​::​bitset как целочисленный тип или как целочисленный, может не скомпилировать с этим международным стандартом. Например:

#include <iostream>

int main() {
  int flag = std::ios_base::hex;
  std::cout.setf(flag);         // error: setf does not take argument of type int
}