[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 }
Насколько широко используется:
программы, у которых есть законные основания рассматривать строковые литералы как указатели на потенциально изменяемую память, вероятно, встречаются редко.