C++ 为什么C++;不允许使用用户定义的运算符?

C++ 为什么C++;不允许使用用户定义的运算符?,c++,parsing,operators,C++,Parsing,Operators,我想知道这件事已经有一段时间了。它们已经有了一大堆,而且可以重载,所以为什么不一直这样做并允许自定义操作符呢?我认为这可能是一个伟大的补充 有人告诉我,这会使语言难以编译。这让我感到奇怪,C++不能真正设计为易于编译,所以它真的是不可撤销的吗?当然,如果将LR解析器与静态表和语法(如 E → T + E | T T → F * T | F F → id | '(' E ')' 这是行不通的。在Prolog中,通常使用运算符优先解析器AFAIK进行解析,可以很容易地定义新的运算符,但语言要简单得

我想知道这件事已经有一段时间了。它们已经有了一大堆,而且可以重载,所以为什么不一直这样做并允许自定义操作符呢?我认为这可能是一个伟大的补充

有人告诉我,这会使语言难以编译。这让我感到奇怪,C++不能真正设计为易于编译,所以它真的是不可撤销的吗?当然,如果将LR解析器与静态表和语法(如

E → T + E | T
T → F * T | F
F → id | '(' E ')'
这是行不通的。在Prolog中,通常使用运算符优先解析器AFAIK进行解析,可以很容易地定义新的运算符,但语言要简单得多。现在,语法显然可以重写为在每个操作符硬编码到语法中的地方接受
标识符


还有哪些其他的解决方案和解析器方案,还有哪些其他因素影响了设计决策?

这将使语言更加复杂。这显然是不可取的


不过,看看吧。使用大量的模板元编程技巧使您提到的内容成为可能,这是一个很长的过程。

实际上,它的设计非常容易解析和编译。C有32个定义的关键字,所有其他标记都是函数和变量


C++只有几个。你可以很容易地识别出哪个令牌是哪个令牌的,所以当你使用+令牌或其他什么时,你就知道该查找什么了。

编译它会比编译已经存在的令牌更困难。此外,运算符的优先级也会有问题:如何定义它?您需要一种方法来告诉编译器一个用户定义的运算符优先于另一个运算符


几乎可以肯定,但我认为C++不需要用“强>其他< /强>方法在脚上开枪:”

< P>允许自定义操作符的问题是,你还必须允许程序员指定如何使用运算符的语法。我认为C++类型的系统可以帮助一点,但是它将帮助解决诸如关联性等问题

这将使本已复杂的语言变得更加复杂……

这种可能性已经考虑了好几次,但每次我/我们都认为可能的问题超过了可能的好处

这不是语言技术问题。即使在1983年我第一次考虑它时,我也知道如何实现它。然而,我的经验是,当我们超越最微不足道的例子时,人们似乎对操作符使用的“明显”含义有着微妙的不同看法。一个典型的例子是
A**b**c
。假设
**
已被设置为指数化。现在
a**b**c
是指
(a**b)**c
还是
a**(b**c)
?我认为答案是显而易见的,我的朋友们也同意了——然后我们发现,在哪一个决议是显而易见的问题上,我们没有达成一致。我的猜测是,这些问题将导致微妙的错误


这通常是可以避免的,因为大多数代码都是由多个人编写的,因此代码应该是“可审阅的”,而且这很难成为语言的“期望”特性


Joel Spolsky对此有自己的看法。

我刚刚发现,实际上可以实现与重载运算符非常相似的功能。考虑

Vector v, a, b; v = a /vectorProduct/ b;

事实证明,您可以通过使用由现有运算符分隔的伪类来实现自定义运算符的行为。=)

我想你得在某个地方划清界限。是的,如果你曾经尝试过编写一个编译器,你会意识到它们并不是那么容易编码的。很容易解析和编译吗?一般的共识是C++是现存的最难编写的编译器语言(例如,),真的,我不敢相信…C++是一个运行时类型推理子系统,它本身的结构非常复杂,在模板替换中存在类型推断,这不是微不足道的,而且从纯解析步骤来看,我认为有些构造是相当可观的。(函数指针和Type是两种东西,我自己的C++解析器有时会发现它的限制)。与自然语言解析相比,它很容易:),它被设计成相对容易地被机器解析。哪些类似的语言更容易解析是另一个问题。从机器的角度来看,ASM无疑是最简单的。和C将比C++更容易,因为它没有操作符重载和模板。公平地说,我们应该与其他OOP语言进行比较,与其他OOP语言相比,C++是不同于其他OO语言的。看看Walter Bright说了些什么():“很难解析,因为一个特定的令牌序列可以生成多个完全不同的解析树,这取决于某些符号被声明为什么。更糟糕的是,许多符号在解析时是未知的,因为它们尚未声明。因此,它必须被解析成一些不确定的状态,然后再被“修复”。这个问题使得不可能正确地解析C++代码而不需要构建C++编译器前端的大部分,包括所有的硬东西。“这甚至会使java变得更简单。。。也许这就是为什么Netbeans和Eclipse总是能够准确地预测编译器错误,而Visual Studio的行为却相当不稳定,有时会在没有错误的地方发现错误,但大多数时候只是没有标记语法/类型错误,这些错误稍后会显示为模糊的编译器错误。添加了相关的引用。一般来说,简单地发布链接作为答案是不可取的。这使得读者更难获得概述(如果有5个不同的答案,并且每个答案都包含一个链接,而没有其他内容,那么找出哪些答案是好的,哪些是坏的,或者只是无关紧要),但也因为你链接到的页面将来可能会被删除,或者上面的文本可能会发生变化。简言之,如果你