returns 无效的预递增运算符
pre increment operator that returns void
以下在 gcc
和 clang
中都编译正常:
class A{
public:
void operator++(){
printf("A++\n");
// return *this;
}
};
"correct"实现这种运算符的方法不是:
class A{
public:
A &operator++(){
printf("A++\n");
return *this;
}
};
void
版本是破解版吗?我从未见过这样的语法。 Google 搜索 returns 只有一篇关于它的教育 IBM 论文。
为什么这不是针对返回自引用实现预增量的广泛使用方式。
Why this is not wide used way to implement pre-increments against returning self reference.
如果你问为什么它是预增量没有这个签名,而不是 return 对它所应用的对象的左值引用,这是因为它旨在评估到一个表达式,这样它就可以像用于内置类型一样使用:
int i = 42;
int j = ++i;
A a;
A b = ++a; // Error if RHS is void
(++a).doSomething(); // ditto
此外,前缀 ++
(和 --
)的预期语义是它们 return 对(修改的)对象的左值引用。做任何不同的事情总会导致混乱。
你当然可以这样写,它会如你所愿。但是有一个通用的设计原则,即重载运算符的工作方式应与 'int' 的工作方式类似,以避免让用户感到惊讶。
人们希望能够写作
A a;
B b = ++a;
因为这就是预增量通常的工作方式,并且会对您的 class 给出的编译器错误感到惊讶。没有技术原因可以说明为什么你不能让它做一些不同的事情,就像你可以让 operator + 为你的 class 做减法一样,如果你真的想要的话。
以下在 gcc
和 clang
中都编译正常:
class A{
public:
void operator++(){
printf("A++\n");
// return *this;
}
};
"correct"实现这种运算符的方法不是:
class A{
public:
A &operator++(){
printf("A++\n");
return *this;
}
};
void
版本是破解版吗?我从未见过这样的语法。 Google 搜索 returns 只有一篇关于它的教育 IBM 论文。
为什么这不是针对返回自引用实现预增量的广泛使用方式。
Why this is not wide used way to implement pre-increments against returning self reference.
如果你问为什么它是预增量没有这个签名,而不是 return 对它所应用的对象的左值引用,这是因为它旨在评估到一个表达式,这样它就可以像用于内置类型一样使用:
int i = 42;
int j = ++i;
A a;
A b = ++a; // Error if RHS is void
(++a).doSomething(); // ditto
此外,前缀 ++
(和 --
)的预期语义是它们 return 对(修改的)对象的左值引用。做任何不同的事情总会导致混乱。
你当然可以这样写,它会如你所愿。但是有一个通用的设计原则,即重载运算符的工作方式应与 'int' 的工作方式类似,以避免让用户感到惊讶。
人们希望能够写作
A a;
B b = ++a;
因为这就是预增量通常的工作方式,并且会对您的 class 给出的编译器错误感到惊讶。没有技术原因可以说明为什么你不能让它做一些不同的事情,就像你可以让 operator + 为你的 class 做减法一样,如果你真的想要的话。