|
|
1
11
前缀和后缀
他们选择的解决方案有些奇怪。他们注意到,所有其他“后缀”运算符(即在其一个操作数之后出现的运算符)实际上都是带两个参数的中缀运算符。例如,普通的
嗯,这是C++演进的一个奇怪的决定。但你已经拿到了。 基于两个原因,您无法根据返回类型区分它们。 首先,C++中的函数不能在返回类型上重载。不能有两个名称和参数类型列表相同但返回值不同的函数。
第二,该方法不够健壮或灵活,无法处理前缀和后缀的所有可能实现
例如,您可能需要一个后缀
|
|
|
2
10
你可以自由地给operator++任何你喜欢的返回类型,所以没有办法用它来区分后缀和前缀。所以编译器需要一些线索。 奥托,我不知道为什么这不能用语法来完成:
毕竟,模仿声明中的用法在C和C++中有传统。
P、 这与按返回类型重载无关。后缀和前缀是两个不同的名称。没有必要解决
|
|
|
3
7
直接从比亚恩嘴里说:
顺便说一下,在我看来,只有前缀
|
|
|
4
2
不允许纯按返回类型重载函数,因此必须使用伪参数来区分两个相同的外观
|
|
|
5
0
如果我有druthers,post increment和许多序列点操作符将被分成两个或三个部分;在postincrement的情况下,像“a=(b+++c++);”这样的语句将被有效地翻译为“a=postinc1(b)+postinc1(c);postinc2(b);postinc2(c)”;postinc2(c);;post increment的第二部分将是一个无效函数。在实际实现中,postinc2()调用可能经常发生,而其他一些结果则位于计算堆栈上;这对编译器来说不太难实现。 在“&”或“| |”的情况下,运算符的第一部分将仅对左操作数执行操作;如果它返回非零(对于&)或非零(对于| |),则第二部分将对两个操作数执行操作。 如果是“?”/“:”,运算符的第一部分将仅对第一个操作数进行操作。如果返回非零,则第二部分将对第一个和第二个参数进行操作;否则,第三部分将对第一个和第三个参数进行操作。 有哪种语言能做到这一点吗?奇怪的是,C++允许操作员以中断序列行为的方式重新定义,但不允许它们以保存它的方式重新定义。 |
|
|
6
0
编译器使用int参数来区分前缀和后缀增量运算符。对于隐式调用,默认值是零,因此实际上它不会对重载运算符的功能产生太大的影响。。。 |