30

C++17 移除了三元组。IBM 强烈反对这一点(此处此处),因此似乎存在移除/不移除双方的争论。

但是既然决定删除三合字母,为什么要留下二合字母呢?除了保留三字母的原因(显然重量不足以保留它们)之外,我没有看到任何保留二合字母的理由。

4

1 回答 1

37

对于不知情的用户来说,三合字母比二合字母更成问题。这是因为它们在字符串文字和注释中被替换。这里有一些例子……</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 的问题要少得多,因为它们不会在另一个标记(即字符串或字符文字)内被替换,并且没有转换为 的序列\,因此不会发生在注释中转义新行的情况。

结论

除了更难阅读代码之外,有向图引起的问题更少,因此大大减少了删除它们的需要。

于 2015-01-20T19:03:08.353 回答