Annex C (informative) Compatibility [diff]

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

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.