为什么后缀增量运算符采用伪参数?
看看这些功能签名:
class Number {
public:
Number& operator++ (); // prefix ++
Number operator++ (int); // postfix ++
};
前缀不带任何参数,但后缀确实如此。为什么?我认为我们可以用不同的返回类型识别它们。
没有找到相关结果
已邀请:
6 个回复
艰管垮淮
毕竟,模仿声明中的用法在C和C ++中具有传统。 附:其他海报:这与返回类型的重载无关。后缀和前缀++ / - 是两个不同的名称。没有必要解决
或
中的重载,因为它完全清楚是指哪个名称。
骇毖煽洁铂
是不同的运算符。使用标准的
风格声明,没有明显的方法来区分这两者。语言设计者想要一些其他的解决方案,而不是提出一些新的语法,如
,这将使它成为一个特殊情况,不像所有其他运算符,并且可能有点难以解析。 他们选择的解决方案有些奇怪。他们注意到所有其他'后缀'运算符(即在其中一个操作数之后发生的运算符)实际上是带有两个参数的中缀运算符。例如,普通老
,
或
。在此基础上,语言设计者决定使用随机伪参数是区分前缀和后缀good4ѭ的好方法。 恕我直言,这是C ++发展过程中做出的陌生决定之一。但是你现在有了。 并且由于两个原因,您无法根据返回类型区分它们。 第一个是C ++中的函数不能在返回类型上重载。您不能拥有两个具有相同名称和参数类型列表但返回值不同的函数。 第二个方法是该方法不够健壮或不够灵活,无法处理前缀和后缀的所有可能实现。 例如,您可能需要一个返回引用类型的后缀
,如果您调用它的唯一原因是调用与您应用它的变量值无关的副作用。在我看来,这将是一个非常糟糕的实现,但C ++不是要判断你想要编写什么类型的愚蠢代码,而是要让你能够编写你认为适合于这种情况的任何代码。并强迫你使用一种特殊的返回类型作为前缀
和后缀
将违背这种精神。
旅牢斯讲
参数用于表示奇数后缀运算符。换句话说,在后缀的情况下,
位于第一个(实际)操作数和第二个(虚拟)参数之间,因此是后缀。 这些解释是必要的,因为这种机制是独特的,因此有点疣。如果有一个选择,我可能会引入
和
关键字,但那时似乎不可行。然而,唯一真正重要的一点是该机制可以工作,并且可以被真正需要它的少数程序员理解和使用。 顺便说一句,在我看来,只有前缀
应该是程序员可以重载的,并且后缀
应该由编译器自动生成。有人同意我的意见吗?
郡晒景沧
运算符。
钨蜡唤喉晤
郸身