【发布时间】:2013-11-16 13:39:27
【问题描述】:
我试图找出让递增和递减运算符的重新版本和后期版本分别可重载的理由。
在我看来,在我所见过的任何类型的类的这些运算符的每个实现中,它们都是相同的运算符(= 做同样的事情),只是在调用时有所不同。
对我来说,C++ 的设计者应该有 one ++ 运算符似乎更合乎逻辑,编译器会根据需要在读取值之前或之后调用它(或者,更有可能,在上一个或下一个序列点,我认为是等效的)
所以,问题是:有没有人有可能不以相同方式实现的案例/类的示例?或者有没有人知道/猜测这种设计选择背后的基本原理?
对于那些更喜欢看代码而不是阅读问题文本的人,这里是摘要:
对于什么类型的T(代表你想要的任何东西的用户定义类)是否有意义,以下两行不具有相同的副作用:
T v;
v++;
++v;
编辑
引用下面@Simple 的评论,我希望能澄清这个问题:
为什么编译器会在语言中使用后增量(重载) 可以自己做一个副本并做预增量
编辑 2
由于许多人显然不清楚这个问题,这里有另一种解释:
考虑以下两行:
b = a++;
b = ++a;
如果是一个操作符(为了论证,我称操作符为+a+),第一行会被编译器翻译成
b = a;
+a+;
第二个进入
+a+;
b = a;
【问题讨论】:
-
考虑到他们有点做做两件不同的事情,即使他们做同样的事情......
-
我不知道你为什么说它们是一样的,实现通常是不同的
-
T x=v++;和T x=++v;怎么样? -
后增量总是可以按照前增量来实现。他在问,如果编译器可以自己复制并进行预增量,为什么语言中会出现后增量(重载)。
-
问题可以扩展为:为什么不能把所有的关系运算符都实现为
operator<;为什么operator!=不能仅仅按照operator==来实现;为什么不能以operator@=等形式实现所有算术运算符。答案是,真的,只是因为有人/某些人认为,如果这些算术运算符可以在 1998 年做不同的事情是个好主意。