C++17 はトライグラフを削除しました。IBM はこれに激しく反対したため (こことここ)、削除/非削除の両側に議論があるようです。
しかし、トライグラフを削除する決定が下されたのに、なぜダイグラフを残すのでしょうか? トライグラフを保持する理由を超えて、ダイグラフを保持する理由はわかりません (それらを保持するのに十分な重みがなかったようです)。
認識していないユーザーにとって、トライグラフはダイグラフよりも問題があります。これは、文字列リテラルとコメント内で置き換えられるためです。ここにいくつかの例があります…</p>
例 A:
std::string example = "What??!??!";
std::cout << example << std::endl;
What||
コンソールに出力されます。これは、trigraph??!
が に変換されるため|
です。
例 B:
// Error ?!?!?!??!??/
std::cout << "There was an error!" << std::endl;
何も起こりません。これは、 が に??/
変換され\
、改行文字がエスケープされ、次の行がコメント アウトされるためです。
例 C:
// This makes no sense ?!?!!?!??!??/
std::string example = "Hello World";
std::cout << example << std::endl;
use of undeclared identifier "example"
これにより、例 B と同じ理由で、の行に沿ってエラーが発生します。
トリグラフが引き起こす可能性のあるはるかに複雑な問題もありますが、その考えは理解できます。このような変換が行われると、多くのコンパイラが実際に警告を発することに注意してください。警告を常にエラーとして扱うもう 1 つの理由です。ただし、これは標準で要求されていないため、信頼することはできません。
ダイグラフは、別のトークン (つまり、文字列または文字リテラル) 内で置き換えられず、 に変換されるシーケンスがないため、トリグラフよりもはるかに問題が少ないため、コメント内の改行を\
エスケープすることはできません。
結論
コードが読みにくくなる以外に、有向グラフによって引き起こされる問題が少なくなるため、有向グラフを削除する必要性が大幅に減少します。