【问题标题】:C++17 why not remove digraphs along with trigraphs?C ++ 17 为什么不删除二合字母和三合字母?
【发布时间】:2014-12-22 11:22:10
【问题描述】:

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

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

【问题讨论】:

  • 圣诞节快到了,所以不允许留胡子的笑脸是可悲的。
  • 请注意,三元组已被弃用,而不是删除。我认为这个想法是让可能正在使用它们的人停止在新代码中使用它们,并让使用旧代码的开发人员最终迁移。他们不会破坏代码——至于为什么:这只是做同样事情的另一种方式,它使语言变得更大更混乱。
  • @BenjaminGruenbaum 据我所知,它们将在 C++17 中完全消失
  • @BenjaminGruenbaum 他们被提议在 C++11 中弃用,但没有通过。在 C++17 中,他们被投票删除
  • 我不知道讨论如何进行(因此不是答案),但可能是因为保留二合字母的负担较低。由于它们不会在 cmets 或字符串文字中被替换,因此您不会意外使用它们。

标签: c++ standards digraphs trigraphs c++17


【解决方案1】:

对于不知情的用户来说,三合字母比二合字母更成问题。这是因为它们在字符串文字和 cmets 中被替换。这里有一些例子……

示例 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 相同。

三元组也可能导致更复杂的问题,但你明白了。值得注意的是,许多编译器在进行此类翻译时实际上会发出警告。总是将警告视为错误的另一个原因。然而,这不是标准所要求的,因此不能依赖。

二合字母比三合字母的问题要少得多,因为它们不会在另一个标记(即字符串或字符文字)内被替换,并且没有转换为\ 的序列,因此无法在 cmets 中转义新行。

结论

除了难以阅读的代码之外,由二合字母引起的问题更少,因此大大减少了删除它们的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2021-09-16
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多