【问题标题】:Why isn't => an overloadable operator in C++?为什么 => 在 C++ 中不是可重载的运算符?
【发布时间】:2019-07-05 14:34:47
【问题描述】:

=> 在 C++ 中不可重载。我一直想知道这是否只是纯粹的巧合,或者是否有特定原因不能重载这两个字符的序列。比较运算符的出现让我相信了前者。

我认为它是重载的主要候选对象,因为它看起来像一个箭头,这在函数式编程语法和数学中非常常见。 Granted -> 已经存在,但是有另一个箭头可能有助于消除两者之间的歧义。我也看不出它如何破坏向后兼容性。

【问题讨论】:

  • => 运算符?也许您的意思是 >= 运算符?那应该是可重载的。
  • @Chipster >= 是可重载的,见这里en.cppreference.com/w/cpp/language/operators
  • 你是在问为什么这不是一个;准备好一个运营商呢?
  • @tadman <=> 是 C++20 中添加的新 three-way comparison operator
  • @MilesBudnek 哦,非常好! Perl 的宇宙飞船操作员已经登陆。

标签: c++ language-lawyer


【解决方案1】:

C++ 只允许重载已经是基础语言中的运算符的运算符。

基本语言定义的运算符,每个都有其相关的优先级和关联性。在运算符重载中,您可以为用户定义类型(或有时,为两个用户定义类型的组合)的类型提供该运算符(将执行的代码)的含义 .

但是,您不能只选择任意一组符号,并将其视为运算符(无论它多么吸引人)。

有些语言确实允许这样做——例如,ML(及其许多后代)允许您定义一个完全不属于基本语言的全新名称的运算符.执行此操作时,您定义了希望该运算符具有的优先级和关联性。我认为这很好,并且提供了有用的功能——但是(至少在 ML 中定义的功能)它也有一些弱点,可能不太适合 C++ 中的工作方式。我不希望很快(或者,可能永远)将它视为 C++ 的一部分。

【讨论】:

  • 正确。实际结果是解析 C++ 要容易得多。解析器可以硬编码运算符列表。运算符重载确实意味着编译器的下一阶段必须更复杂,但对于编辑器之类的东西来说,更简单的解析是一个显着的好处。 (虽然 C++11 用 >> 上下文关闭了两个模板参数列表打破了这些解析器)
【解决方案2】:

在 C++ 中,“重载”是一种为现有运算符提供自定义定义以便它们可以在自定义类型中使用的机制,而不是一种向语言添加新运算符的机制。您无法更改“=>”运算符的含义,因为 C++(至少在撰写本文时)没有“=>”运算符。

作为对 Jerry 出色答案的补充,我想指出,这绝不是一个疏忽,而是一个非常有意识的设计决定。 C++ 语言的最初创造者 Bjarne Stroustrup 在他的精彩著作“C++ 的设计和演变”中描述了他对此的想法,我在此引用:

我 [Stroustrup] 认为提供重载作为一种扩展语言的机制很重要,而 来改变它;也就是说,可以定义运算符来处理用户定义的类型(类),但不能改变运算符在内置类型上的含义。 另外,我不想让程序员引入新的操作符。我害怕神秘的符号,不得不采用复杂的解析策略,比如 Algol68 所需的那些。”

(粗体强调,原文为斜体)

资料来源:Stroustrup,Bjarne:“C++ 的设计和演变”,Addison-Wesley,1994 年。§3.6.5

PS:虽然作为现代 C++ 设计的参考资料有点过时,但它是探索导致原始 C++ 语言设计的历史和推理的绝佳且引人入胜的资源。语言的进一步设计长期以来一直在 ISO 标准委员会的职权范围内,但它的不断发展继续受到书中描述的许多相同原则的推动,并且 Stroustrup 博士继续在这一发展过程中发挥重要作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2013-05-06
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多