Триграфы упали
Исходные файлы кодируются в физическом наборе символов, который определяется способом, определяемым реализацией, на исходный набор символов , который определен в стандарте. Чтобы приспособить отображения из некоторых физических наборов символов, которые изначально не имели всей пунктуации, необходимой для исходного набора символов, язык определил триграфы - последовательности из трех общих символов, которые можно было использовать вместо менее распространенного символа пунктуации. Для их обработки требовались препроцессор и компилятор.
В C ++ 17 триграфы были удалены. Таким образом, некоторые исходные файлы не будут приняты более новыми компиляторами, если они не будут сначала переведены из физического набора символов в какой-либо другой физический набор символов, который однозначно отображает исходный набор символов. (На практике большинство компиляторов просто сделали интерпретацию триграфов необязательной.) Это не тонкое изменение поведения, а критическое изменение, предотвращающее компиляцию ранее приемлемых исходных файлов без внешнего процесса перевода.
Больше ограничений на char
Стандарт также относится к набору символов выполнения , который определяется реализацией, но должен содержать как минимум весь исходный набор символов плюс небольшое количество управляющих кодов.
Стандарт C ++, определенный charкак целочисленный тип, возможно, без знака, который может эффективно представлять каждое значение в наборе символов выполнения. По мнению юриста-лингвиста, вы можете утверждать, что a charдолжно быть не менее 8 бит.
Если в вашей реализации используется беззнаковое значение для char, то вы знаете, что оно может находиться в диапазоне от 0 до 255 и, следовательно, подходит для хранения всех возможных байтовых значений.
Но если ваша реализация использует значение со знаком, у нее есть варианты.
Большинство из них используют дополнение до двух, что дает charминимальный диапазон от -128 до 127. Это 256 уникальных значений.
Но другой вариант - знак + величина, где один бит зарезервирован, чтобы указать, является ли число отрицательным, а остальные семь битов указывают величину. Это даст charдиапазон от -127 до 127, что составляет всего 255 уникальных значений. (Потому что вы теряете одну полезную комбинацию битов для представления -0.)
Я не уверен, что комитет когда-либо явным образом обозначил это как дефект, но это произошло потому, что вы не могли полагаться на стандарт, чтобы гарантировать, что круговой рейс unsigned charтуда charи обратно сохранит исходное значение. (На практике все реализации использовали, потому что все они использовали дополнение до двух для целочисленных типов со знаком.)
Только недавно (C ++ 17?) Была исправлена формулировка, обеспечивающая циклическое переключение. Это исправление, наряду со всеми другими требованиями char, фактически требует дополнения до двух для подписи, charне говоря об этом явно (даже несмотря на то, что стандарт продолжает разрешать представления знак + величина для других целочисленных типов со знаком). Есть предложение потребовать, чтобы все подписанные интегральные типы использовали два дополнения, но я не помню, вошло ли оно в C ++ 20.
Так что это своего рода противоположность тому, что вы ищете, потому что оно дает ранее некорректный и чрезмерно самонадеянный код обратного исправления.