Заставить ++o++ жаловаться на типы с определяемыми пользователем пре- и постфиксными операторами приращения
Я ищу способ предотвратить
++x++
от работы с типами с определяемыми пользователем префиксными и постфиксными операторами приращения.
Для встроенных типов тип результата постфиксного оператора - это не lvalue, а выражение prvalue, и компиляторы хорошо жалуются.
Самое простое, что я могу придумать, - это вернуть 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 .
2 ответа
Ты наверное хочешь
S& operator++() &
и
S operator++(int) &
. Вам не хватает
&
в конце, что заставляет операторов работать только с lvalue.
Вы хотите сделать приставку
++
Оператор работает только с lvalues.
Этот синтаксис работает с C ++ 11.
S& operator++() & {
// ^ This & allows only lvalues for *this
++i_;
return *this;
}