Заставить ++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;
}

Вот крестовина .

Другие вопросы по тегам