使 ++o++ 抱怨带有用户定义的前缀和后缀增量运算符的类型

问题描述

我正在寻找一种方法来防止 ++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++;
}

Here's a godbolt

这种方法有缺陷吗?

编辑:

感谢答案,我找到了更多信息 herehere,当然还有 cppreference

解决方法

您可能需要 S& operator++() &S operator++(int) &。您在末尾遗漏了 &,它使运算符仅适用于左值。

,

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

此语法自 C++11 起有效。

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

Here's a godbolt

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...