3

我正在寻找一种方法来防止++x++使用用户定义的前缀和后缀增量运算符的类型。

对于内置类型,后缀运算符的结果类型不是左值而是纯右值表达式,编译器抱怨得很好。

我能想到的最简单的事情是为后缀增量运算符返回 const:

struct S {
    int i_;
    S& operator++() {
        ++i_;
        return *this;
    }
    S /*const*/ operator++(int) {
        S result(*this);
        ++(*this);
        return result;
    }
};
int main() {
    S s2{0};
    ++s2++;
}

这是一个神螺栓

这种方法有缺陷吗?

编辑:

多亏了答案,我在这里这里以及当然在cppreference上找到了更多信息。

4

2 回答 2

4

你可能想要S& operator++() &S operator++(int) &. 你&最后错过了使运算符只对左值起作用的结尾。

于 2021-03-24T20:49:42.920 回答
2

您希望使前缀++运算符仅适用于左值。

此语法从 C++11 开始有效。

S& operator++() & {
//              ^ This & allows only lvalues for *this
    ++i_;
    return *this;
}

这是一个神螺栓

于 2021-03-24T20:50:17.387 回答