Annex C (informative) Compatibility [diff]

C.1 C++ and ISO C [diff.iso]

C.1.1 Clause [lex]: lexical conventions [diff.lex]

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

[lex.ccon]
Изменение: Тип символьного литерала изменен с int на char.
Обоснование: это необходимо для улучшенного сопоставления типов аргументов перегруженной функции. Например:

int function( int i );
int function( char c );

function( 'x' );

Предпочтительно, чтобы этот вызов соответствовал второй версии функции, а не первой.
Влияние на исходную функцию: изменение семантики четко определенной функции. Программы ISO C, зависящие от

sizeof('x') == sizeof(int)

не будет работать так же, как программы на C ++.
Сложность конвертации: Простая.
Насколько широко используется: Зависящие от sizeof('x') него программы, вероятно, встречаются редко.

Подпункт [lex.string]:
Изменение: строковые литералы сделаны константными.
Тип строкового литерала изменяется с «массив char» на «массив из const char». Тип char16_­t строкового литерала изменяется с «массив some-integer-type» на «массив из const char16_­t». Тип char32_­t строкового литерала изменяется с «массив some-integer-type» на «массив из const char32_­t». Тип широкого строкового литерала изменяется с «массив wchar_­t» на «массив из const wchar_­t».
Обоснование: это позволяет избежать вызова несоответствующей перегруженной функции, которая может рассчитывать на изменение своего аргумента.
Влияние на исходную функцию: изменение семантики четко определенной функции.
Сложность преобразования: синтаксическое преобразование. Исправление состоит в том, чтобы добавить приведение:

char* p = "abc";                // valid in C, invalid in C++
void f(char*) {
  char* p = (char*)"abc";       // OK: cast added
  f(p);
  f((char*)"def");              // OK: cast added
}


Насколько широко используется: программы, у которых есть законные основания рассматривать строковые литералы как указатели на потенциально изменяемую память, вероятно, встречаются редко.