C++17 移除了三元组。IBM 强烈反对这一点(此处和此处),因此似乎存在移除/不移除双方的争论。
但是既然决定删除三合字母,为什么要留下二合字母呢?除了保留三字母的原因(显然重量不足以保留它们)之外,我没有看到任何保留二合字母的理由。
对于不知情的用户来说,三合字母比二合字母更成问题。这是因为它们在字符串文字和注释中被替换。这里有一些例子……</p>
示例 A:
std::string example = "What??!??!";
std::cout << example << std::endl;
What||
将打印到控制台。这是因为三元组??!
被翻译成|
.
示例 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 相同的原因,这将产生错误。
三元组也可能导致更复杂的问题,但你明白了。值得注意的是,许多编译器在进行此类翻译时实际上会发出警告。总是将警告视为错误的另一个原因。然而,这不是标准所要求的,因此不能依赖。
Digraphs 比 trigraphs 的问题要少得多,因为它们不会在另一个标记(即字符串或字符文字)内被替换,并且没有转换为 的序列\
,因此不会发生在注释中转义新行的情况。
结论
除了更难阅读代码之外,有向图引起的问题更少,因此大大减少了删除它们的需要。