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

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

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


person bolov    schedule 22.12.2014    source источник
comment
Скоро Рождество, поэтому запретить смайлики с бородой было бы грустно.   -  person rightfold    schedule 22.12.2014
comment
Обратите внимание, что триграфы устарели, а не удалены. Я думаю, что идея состоит в том, чтобы заставить людей, которые могут их использовать, прекратить использовать их в новом коде, а разработчиков со старым кодом в конечном итоге мигрировать. Они не будут взламывать код - почему: это просто еще один способ сделать то же самое, что делает язык немного больше и более запутанным.   -  person Benjamin Gruenbaum    schedule 22.12.2014
comment
@BenjaminGruenbaum Насколько мне известно, они полностью исчезнут в C++ 17.   -  person Xeo    schedule 22.12.2014
comment
@BenjaminGruenbaum они были предложены к прекращению поддержки в C ++ 11, но это не прошло. В C++17 за удаление проголосовали.   -  person bolov    schedule 22.12.2014
comment
Я не знаю, как пошла дискуссия (поэтому не ответ), но, вероятно, это потому, что бремя хранения орграфов ниже. Поскольку они не заменяются в комментариях или строковых литералах, вы не используете их случайно.   -  person Steve Jessop    schedule 28.12.2014
comment
EBCDIC (сущ.) — попытка бессрочного технического долга, предоставленная IBM.   -  person    schedule 07.09.2016


Ответы (1)


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

Пример А:

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

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

Пример Б:

// 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.

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

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

Заключение

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

person OMGtechy    schedule 20.01.2015