=>在C ++中不可重载。我一直想知道这是纯粹的巧合,还是有一个特定的原因不能导致两个字符的序列重载。比较运算符<=>的出现使我相信前者。
我认为这是重载的最佳选择,因为它看起来像箭头,这在函数式编程语法和数学中非常常见。授予->已经存在,但使用另一个箭头可能有助于消除两者之间的歧义。我也看不到它如何破坏向后兼容性。
答案 0 :(得分:12)
C ++仅允许您重载已经是基本语言运算符的运算符。
基本语言定义了运算符,每个运算符都有其关联的优先级和关联性。在运算符重载中,可以为用户定义类型的类型(或有时为两个用户定义类型的组合)提供该运算符的含义(将执行的代码)
但是,您不能只选择任意一组符号并将其视为运算符(无论它有多诱人)。
有些语言可以做到这一点-例如,ML(及其许多后代)允许您使用一个全新的名称来定义运算符,而该名称根本不属于基本语言。在执行此操作时,可以定义该运算符具有的优先级和关联性。我认为这很棒,并且提供了有用的功能-但是(至少由于该功能是在ML中定义的),它也存在一些弱点,可能与C ++的工作方式不太相称。我不希望很快(或者可能永远)将它视为C ++的一部分。
答案 1 :(得分:5)
在C ++中,“重载”是一种为现有运算符提供自定义定义的机制,以便可以在自定义类型中使用它们,而不是向语言添加新运算符的机制。您无法更改“ =>”运算符的含义,因为C ++(至少在撰写本文时)没有“ =>”运算符。
作为杰里的一个很好的补充,我想指出,这绝不是疏忽大意,而是一个非常有意识的设计决定。 C ++语言的原始创建者Bjarne Stroustrup在他的著作《 C ++的设计和演进》中描述了他对此的想法,我在这里引用:
我[Stroustrup]认为,提供重载作为扩展语言的机制很重要,而提供 not 进行突变的机制很重要;也就是说,可以定义运算符以使用用户定义的类型(类),但不能更改内置类型的运算符的含义。 此外,我不想让程序员引入新的运算符。我担心采用隐喻表示法,不得不采用复杂的解析策略,例如Algol68所需的解析策略。”
(加粗强调,斜体)
资料来源:Stroustrup,Bjarne:“ C ++的设计和演进”,Addison-Wesley,1994年。§3.6.5
PS:尽管对于现代C ++设计有一定的参考意义,但这是探索导致原始C ++语言设计的历史和推理的极好且引人入胜的资源。语言的进一步设计长期以来一直由ISO标准委员会负责,但其持续发展一直受到本书中描述的许多相同原则的推动,而Stroustrup博士仍然是该发展过程中的重要声音。 / p>