看一下这些功能签名:
class Number {
public:
Number& operator++ (); // prefix ++
Number operator++ (int); // postfix ++
};
前缀不带任何参数,但后缀带。为什么?我认为我们可以用不同的返回类型来识别它们。
最佳答案
前缀和后缀++
是不同的运算符。使用标准的Foo operator symbol(Foo &)
样式声明,没有明显的方法来区分两者。语言设计师并没有想出像Foo symbol operator(Foo &)
这样的新语法来使它成为不同于所有其他运算符的特例,并且可能很难解析,而是设计了其他解决方案。
他们选择的解决方案有些奇怪。他们指出,所有其他“后缀”运算符(即在其操作数之一之后发生的运算符)实际上是采用两个参数的中缀运算符。例如,普通的旧+
,/
或>
。在此基础上,语言设计人员认为,拥有随机的虚拟参数将是区分前缀和后缀++
的好方法。
恕我直言,这是C++演变时做出的陌生决定之一。但是你现在有了。
由于两个原因,您无法根据返回类型来区分它们。
首先是C++中的函数不能在返回类型上重载。您不能具有名称和参数类型列表相同但返回值不同的两个函数。
第二个问题是该方法不够强大或不够灵活,无法处理prefix和postfix ++
的所有可能的实现。
例如,如果您曾经调用过的唯一原因是调用与所应用变量的值无关的副作用,则可能需要返回引用类型的后缀++
。在我看来,这将是非常糟糕的实现,但是C++并不是要判断您要编写哪种愚蠢的代码,而是要使您能够编写自己认为适合的任何代码。强制您对前缀++
和后缀++
使用一种特殊的返回类型样式将与这种精神背道而驰。