以下内容在gcc
和clang
中编译正常:
class A{
public:
void operator++(){
printf("A++\n");
// return *this;
}
};
不能“纠正”实现这种运算符的方式是:
class A{
public:
A &operator++(){
printf("A++\n");
return *this;
}
};
void
版本是黑客吗?我从未见过这样的语法。谷歌搜索只返回一篇关于它的IBM教育论文。
为什么这不是广泛使用的方法来实现对返回自引用的预增量。
答案 0 :(得分:6)
为什么这不是广泛使用的方法来实现对返回自引用的预增量。
如果你问为什么它是预增量没有这个签名,而不是返回它应用的对象的左值引用,那是因为它被设计为评估表达式,这样它可以像内置类型一样使用:
int i = 42;
int j = ++i;
A a;
A b = ++a; // Error if RHS is void
(++a).doSomething(); // ditto
此外,前缀++
(和--
)的预期语义是它们返回对(修改的)对象的左值引用。做任何不同的事情都会导致混乱。
答案 1 :(得分:1)
你当然可以这样写,它会做你想要的。但是设计的一般原则是,重载运算符应该以类似于' int'会避免让用户感到惊讶。
人们希望能够写出
A a;
B b = ++a;
因为预增量通常是如何工作的,并且会因为编译器错误而感到惊讶,这会给你的课程带来好处。没有技术上的理由说明为什么你不能让它做出不同的事情,就像你真正想要的那样你可以为你的班级做算子+做减法。