为什么C++中的可重载操作符不是? => C++中不可重载。我一直想知道这是否只是一个纯粹的巧合,或者是否有一个特殊的原因,这两个字符的序列不能超载。比较运算符的出现使我相信前者

为什么C++中的可重载操作符不是? => C++中不可重载。我一直想知道这是否只是一个纯粹的巧合,或者是否有一个特殊的原因,这两个字符的序列不能超载。比较运算符的出现使我相信前者,c++,language-lawyer,C++,Language Lawyer,我认为它是重载的主要候选对象,因为它看起来像箭头,这在函数编程语法和数学中非常常见。已授予->已存在,但有另一个箭头可能有助于消除两者之间的歧义。我也不认为它会破坏向后兼容性 C++只允许重载已经是基础语言中的运算符的运算符 基本语言定义的运算符,每个运算符都有其关联的优先级和关联性。在运算符重载中,您可以为该运算符提供代码的含义,该代码将针对用户定义类型的类型执行,有时针对两个用户定义类型的组合执行 然而,您不能仅仅选择一组任意的符号,并将其视为一个运算符,不管它有多吸引人 有些语言确实允许这

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

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

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

然而,您不能仅仅选择一组任意的符号,并将其视为一个运算符,不管它有多吸引人


有些语言确实允许这样做,例如,ML及其许多子体允许您使用完全不属于基础语言的全新名称定义运算符。执行此操作时,将定义希望该运算符具有的优先级和关联性。我认为这很好,并且提供了一个有用的能力,但是至少在ML中定义了能力,它也有一些弱点,可能与C++中的事情如何工作不太吻合。我不希望在任何时候或很快地将它看作是C++的一部分。在C++中,

,“重载”是一种机制,用于为现有的操作符提供自定义的定义,以便它们可以用于自定义类型,而不是用于向语言添加新的操作符的机制。你不能改变“=”操作符的含义,因为C++在这个写作中至少没有一个“= >”运算符。 作为对Jerry伟大答案的补充,我想指出,这不是一个疏忽,而是一个非常有意识的设计决策。Bjarne Stroustrup,C++语言的最初创建者,在他的精彩著作《C++的设计与演化》中描述了他的思想,如我在这里引用的:

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

粗体强调我的,斜体在原文中

来源:Stroustrup,BjARne:“C++的设计和进化”,Addison Wesley,1994。§3.6.5


PS:虽然有点过时,作为现代C++设计的参考,但这是一个极好的、迷人的来源,它可以探索历史和推理,从而设计出原始C++语言。长期以来,语言的进一步设计一直在ISO标准委员会的职权范围内,但其持续发展仍受到书中所述许多相同原则的推动,Stroustrup博士在这一发展过程中仍然是一个重要的声音。

操作员?也许你指的是>=操作符?这应该是可重载的。@Chipster>=是可重载的,请看这里,您在问为什么这不是一个;准备好操作员了吗?@tadman是C++20中添加的新操作符。@MilesBudnek哦,非常好!Perl的飞船操作员已着陆。正确。实际的结果是解析C++更容易。解析器可以硬编码运算符列表。运算符重载确实意味着编译器的下一阶段必须更加复杂,但对于编辑器之类的东西来说,更简单的解析是一个显著的好处。虽然C++11通过>>上下文关闭两个模板参数列表打破了这些解析器