[英]pre increment operator that returns void
以下是在gcc
和clang
中都可以编译的代码:
class A{
public:
void operator++(){
printf("A++\n");
// return *this;
}
};
不是“正确”的方法来实现这种运算符是:
class A{
public:
A &operator++(){
printf("A++\n");
return *this;
}
};
void
版本是黑客吗? 我从未见过这样的语法。 Google搜索仅返回一篇有关此的IBM教育性论文。
为什么这不是广泛使用的方法来实现针对返回自引用的预增量。
为什么这不是广泛使用的方法来实现针对返回自引用的预增量。
如果您要问为什么它是预增量的,则没有此签名,而不是返回对其应用的对象的左值引用,这是因为它旨在对表达式求值,因此可以使用它以与内置类型相同的方式:
int i = 42;
int j = ++i;
A a;
A b = ++a; // Error if RHS is void
(++a).doSomething(); // ditto
此外,前缀++
(和--
)的预期语义是它们返回对(已修改)对象的左值引用。 做任何不同的事情都会导致混乱。
您当然可以用这种方式编写它,它会做您想要的事情。 但是,设计有一个通用原则,即重载运算符的工作方式应与“ int”的工作方式类似,以避免出现惊讶的用户。
人们期望能够写作
A a;
B b = ++a;
因为这是预增量通常的工作方式,并且会因类产生的编译器错误而感到惊讶。 没有技术上的原因为什么您不能让它做一些不同的事情,就像您确实愿意的那样,可以让运算符+对类进行减法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.