问题描述
我正在寻找一种方法来防止 ++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、here,当然还有 cppreference。
解决方法
您可能需要 S& operator++() &
和 S operator++(int) &
。您在末尾遗漏了 &
,它使运算符仅适用于左值。
您希望前缀 ++
运算符仅适用于左值。
此语法自 C++11 起有效。
S& operator++() & {
// ^ This & allows only lvalues for *this
++i_;
return *this;
}