Trigraphy są bardziej problematyczne dla nieświadomego użytkownika niż dwuznak. Dzieje się tak dlatego, że są one zastępowane w literałach i komentarzach tekstowych. Oto kilka przykładów ...
Przykład A:
std::string example = "What??!??!";
std::cout << example << std::endl;
What||
zostanie wydrukowany do konsoli. Jest tak dlatego, że trigraph ??!
jest tłumaczony na |
.
Przykład B:
// Error ?!?!?!??!??/
std::cout << "There was an error!" << std::end;
Nic się nie stanie w ogóle. Dzieje się tak dlatego, ponieważ ??/
tłumaczy się na \
, który wymyka się znakowi nowego wiersza i powoduje skomentowanie następnej linii.
Przykład C:
// This makes no sense ?!?!!?!??!??/
std::string example = "Hello World";
std::cout << example << std::endl;
ta daje błąd wzdłuż linii use of undeclared identifier "example"
tych samych przyczyn jak w przykładzie B.
Jest o wiele bardziej złożone problemy trójznaków mogą powodować także, ale Masz pomysł. Warto zauważyć, że wiele kompilatorów faktycznie wysyła ostrzeżenie podczas wykonywania takich tłumaczeń; jeszcze jeden powód, aby traktować ostrzeżenia jako błędy. Jednak nie jest to wymagane przez standard i dlatego nie można na nim polegać.
Wykładziny są znacznie mniej problematyczne niż trigrafy, ponieważ nie są zastępowane wewnątrz innego tokenu (tzn. Ciąg znaków lub literał znaków) i nie ma sekwencji, która tłumaczy się na \
, więc nie ma możliwości uniknięcia nowych linii w komentarzach.
Wnioski
Inne niż trudniejsze do odczytania kodu, są mniej problemów spowodowanych przez digrafach i dlatego trzeba je usunąć jest znacznie zmniejszona.
Prawie świąteczne, więc niedozwolone buźki z brodami będą smutne. – rightfold
Należy zauważyć, że trigraphy są _deprecowane_, a nie _removed_. Myślę, że chodzi o to, aby zachęcić ludzi, którzy mogą ich używać, do zaprzestania ich używania w nowym kodzie i do ostatecznego przekonania programistów, którzy mają stary kod do migracji. Nie będą łamać kodu - i dlaczego: jest to po prostu inny sposób na zrobienie tego samego, co sprawia, że język jest odrobinę większy i bardziej zagmatwany. –
@BenjaminGruenbaum O ile mi wiadomo, nie będzie ich całkowicie w C++ 17 – Xeo