为什么不是=> C++中的可重载运算符?

use*_*940 -1 c++ language-lawyer

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

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

Jer*_*fin 12

C++只允许您重载已经是基本语言运算符的运算符.

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

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

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


Eur*_*lli 5

在C++中,"重载"是一种为现有运算符提供自定义定义的机制,因此它们可以用于自定义类型,而不是用于向该语言添加新运算符的机制.你不能改变"=>"运算符的含义,因为C++(至少在写这篇文章时)没有"=>"运算符.

作为Jerry的最佳答案的补充,我想指出,这不是任何延伸的疏忽,而是一个非常有意识的设计决定.Bjarne Stroustrup,C++语言的最初创建者,在他的精彩书籍" C++的设计和演变 "中描述了他对此的看法,我在这里引用:

我[Stroustrup]认为提供重载作为扩展语言的机制而不是改变它很重要; 也就是说,可以定义运算符来处理用户定义的类型(类),但不能更改内置类型的运算符的含义.另外,我不想让程序员引入新的运算符.我担心含糊不清的符号,不得不采用像Algol68所需的复杂解析策略."

(大胆强调我的,原始的斜体)

资料来源:Stroustrup,Bjarne:"C++的设计与演变",Addison-Wesley,1994年.§3.6.5

PS:虽然有点过时作为现代C++设计的参考,但这是探索导致原始C++语言设计的历史和推理的优秀而迷人的资源.语言的进一步设计长期以来一直属于ISO标准委员会的职权范围,但其持续的发展仍然受到本书中描述的许多相同原理的推动,而Stroustrup博士仍然是该演化过程中的重要声音.