Подтвердить что ты не робот

С++ 1z почему бы не удалить орграфы вместе с триграфами?

С++ 1z удалит триграфы. IBM решительно выступала против этого (здесь и здесь), поэтому, похоже, есть аргументы для обеих сторон удаления/удаление.

Но поскольку было принято решение удалить триграфы, зачем оставлять орграфы? Я не вижу никаких причин держать орграфы за пределами причин, чтобы сохранить триграфы (которые, по-видимому, не имели достаточного веса, чтобы держать их).

4b9b3361

Ответ 1

Триграфы более проблематичны для незнакомого пользователя, чем орграфы. Это происходит потому, что они заменяются в строковых литералах и комментариях. Вот несколько примеров...

Пример A:

std::string example = "What??!??!";
std::cout << example << std::endl;

What|| будет напечатан на консоли. Это связано с тем, что триграф ??! переводится на |.

Пример B:

// Error ?!?!?!??!??/
std::cout << "There was an error!" << std::end;

Ничего не произойдет вообще. Это связано с тем, что ??/ переводится в \, что ускользает от символа новой строки и приводит к прочтению следующей строки.

Пример C:

// This makes no sense ?!?!!?!??!??/
std::string example = "Hello World";
std::cout << example << std::endl;

Это даст ошибку вдоль строк use of undeclared identifier "example" по тем же причинам, что и в примере B.

Есть еще более сложные проблемы, которые могут вызвать триграфы, но вы получаете идею. Следует отметить, что многие составители действительно выдают предупреждение, когда такие переводы делаются; еще одна причина всегда относиться к предупреждениям как к ошибкам. Однако это не требуется стандартом и, следовательно, нельзя полагаться.

Диграфы гораздо менее проблематичны, чем триграфы, так как они не заменяются внутри другого токена (т.е. строки или символьного литерала), и нет последовательности, которая преобразуется в \, поэтому экранирование новых строк в комментариях не может быть.

Заключение

Помимо более трудного для чтения кода, меньше проблем, вызванных орграфами, и поэтому необходимость их удаления значительно уменьшается.