繁体   English   中英

返回void的预增量运算符

[英]pre increment operator that returns void

以下是在gccclang中都可以编译的代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM